백엔드개발/Java

[JAVA] 멘토씨리즈 자바 Chapter6

aaahyunseo 2024. 10. 12. 03:14

*오늘의 학습 목표*

객체지향프로그래밍, 클래스, 메서드 개념을 90% 이상 이해하기


(1)객체지향 언어란?

객체지향 언어로는 자바, 파이썬이 대표적이라고 알고있음

(일단 무지한 나의 배경지식)

이제 책의 언어를 빌려보자면

"현실에 존재하는 사물과 개념들을 소프트웨어적으로 구현하고,

그 구현된 객체들이 상호작용하여 데이터를 처리하는 방식"

객체지향 언어의 특징으로는

코드의 재사용성 : 새로운 코드를 작성할 때 기존의 코드를 이용함으로써

코드의 수를 크게 줄일 수 있고 유지 보수에도 편리함.

신뢰성 높은 프로그래밍 : 제어자와 메서드를 사용해서 데이터를 보호함.

코드 관리의 편리함 : 객체지향 프로그래밍은 한 부분만 변경하면

관련된 모든 부분이 변경되므로 관리가 편리함.


(2)클래스와 객체

클래스란?

"객체를 만들기 위한 설계도"

+ 인스턴스(Instance)는 클래스를 통해 만들어진 실질적인 형태

※클래스의 사용

클래스는 구현하고자 하는 객체의 속성과 기능들을 정의하는 설계도.

속성을 변수로 기능을 메서드(함수)로

나타낸다고 보면

클래스는 변수와 메서드의 집합.

class 클래스명{ /*속성(변수) 작성*/ /*기능(메서드) 작성*/ }

클래스로부터 인스턴스를 생성해야 변수와 메서드를 활용 가능함.

클래스명 변수명 = new 클래스명();

이는 클래스의 객체를 참조할 수 있는 참조변수를 선언하는 동시에

객체의 주소를 참조변수에 저장하도록 선언하는 것.

※참조변수 : 주소를 저장하는 변수

예를 들어

그동안 알고 있던 일반변수는 "a"라는 데이터를 저장하는 상자였던 것이고,

참조변수는 'a'라는 데이터가 저장되어 있는 주소를 저장하는 상자인 것.

참조변수로 인스턴스에 접근하는 방법은

변수에 접근할 경우 : 참조변수.변수명

메서드를 실행시킬 경우 : 참조변수.메서드명();

Test04_01.java

Test04_01.java(2)

Line16에서

Car mycar = new Car();

→ 인스턴스 생성 코드

new 연산자를 통해 Car 인스턴스를 생성했고,

mycar라는 car 타입의 참조변수에 인스턴스 주소값을 저장한 것.

이후부터는 mycar.변수명 혹은 mycar.메서드(); 와 같은 형태로 활용.

tip)인스턴스를 여러 개 생성할 수 있음.

(예를 들어 mycar1, mycar2와 같이)

Test04_02.java

Test04_02.java(2)


(3)인스턴스변수와 클래스변수

인스턴스변수란?

객체마다 가지는 고유한 변수

인스턴스를 생성할 때 만들어짐.

class Cars{ int speed; //인스턴스 변수 선언 (기존방식과 동일) }

클래스변수란?

모든 인스턴스가 공통된 값을 공유하는 변수

모든 인스턴스가 같은 저장 공간을 공유하며

클래스가 처음 메모리에 로딩될 때 생성됨.

class Cars{ static int wheel; // 클래스 변수의 선언(변수 선언부 앞에 static 붙이기) }

Test04_03.java

Test04_03.java(2)

tip) 클래스 변수는 인스턴스를 생성하지 않아도

접근이 가능하지만

인스턴스 변수는 인스턴스가 생성된 후에만

접근이 가능함.

또한

변경 후에서 speed는 mycar2만 변경됐고,

wheel은 mycar1,2 모두 변경된 것을 보면

인스턴스 변수는 각 인스턴스마다 고유의 저장 공간을 갖고 있어

별개의 조정이 가능하고,

클래스 변수는 공통된 하나의 저장 공간을 갖고 있어

모든 인스턴스가 함께 공유된 다는 것을 알 수 있음.


(4)메서드

: 특정한 작업이나 논리를 구성하는 코드를 묶어 놓은 것

입력 값을 받아 내부에서 처리하여 결과를 출력 또는 반환 하는 역할을 함.(=함수)

메서드의 사용

반환타입 메서드명(타입 변수명1, 타입 변수명2,...){ //메서드 내부의 동작 return; }

반환타입 : 메서드의 반환 값의 타입을 정해주는 것

(반환하는 값이 없으면 반환 타입은 void로 지정)

메서드명 : 대부분 소문자로 시작하는 것이 일반적임

return값 : 반환 타입이 void인 경우를 제외하고는 반드시

메서드 내부에 return문이 포함되어야 함.

(return값은 반드시 하나)

예를 들어

int calculator(int a, int b){ System.out.println("계산 시작") int area = a*b; return area; }

와 같은 구성

※메서드도 클래스 메서드와 인스턴스 메서드로 구분

class cars{ boolean powerOn(){} // 인스턴스 메서드 static boolean wiperoOn(){} // 클래스 메서드 }

Test04_04.java

Test04_04.java(2)

변수 때와 마찬가지로

클래스 메서드는 객체를 생성하지 않아도

호출이 가능하지만

인스턴스 메서드는 객체를 생성해야만

호출이 가능해짐.

++++++++++

클래스 멤버와 인스턴스 멤버(P.98)

클래스 변수와 클래스 메서드를 클래스 멤버

인스턴스 변수와 인스턴스 메서드를 인스턴스 멤버라고 부름

인스턴스 멤버의 클래스 멤버 사용 → 가능

클래스 멤버의 인스턴스 멤버 사용 → 에러

인스턴스 멤버의 인스턴스 멤버 사용 → 가능

클래스 멤버의 클래스 멤버 사용 → 가능

같은 클래스에 속한 멤버들끼리는 인스턴스를 생성하지 않고도

변수를 참조하거나 메서드 호출이 가능.

하지만 클래스 메서드로 인스턴스 멤버들을 참조하는 것만은

에러 발생.

→ 클래스 멤버가 존재하려면 처음 클래스가

메모리에 올라가야 하는데 이때 인스턴스 멤버는 존재하지 않기 때문


(5)오버로딩

: 매개변수의 개수와 타입은 다르지만 이름이 같은 메서드를 여러 개 정의하는 것

예를 들어

int sum(int a, int b){ return a+b; } int sum(int a, int b, int c){ return a+b+c; }

메서드의 이름은 다르게 구분해야 하지만

같은 기능을 하는 메서드의 이름을 매번 다르게 하지 않고

같은 이름으로 설정해둔다면

개수와 타입이 알맞은 메서드를

프로그램이 알아서 호출함.

System.out.println(); 도

대표적인 오버로딩의 예


(6)생성자

: 인스턴스를 생성할 때 호출되어 인스턴스 변수들을 초기화하는 일종의 메서드

생성자의 이름은 클래스의 이름과 같으며

생성자에는 리턴 값이 없음.

그러므로 반환타입도 필요없음

기본 생성자

클래스이름(){ }

class Cellphone{ String model; String color; int capacity; Cellphone(){} //기본 생성자 }

※모든 클래스에는 반드시 하나 이상의 생성자가 존재해야 함.

그러나 지금까지는 컴파일러가 자동으로

기본 생성자를 추가해줬던 것

Test04_05.java

Line15를 주의해서 보면

참조변수를 생성할 때 불러올 클래스 속 생성자에서

매개변수를 갖고 있으면

매개변수를 지정해 줘야함

//Cellphone myphone = new Cellphone(); 으로 하면 오류남.

기본 생성자 안에 직접 작성해서 사용할 수도 있음.

예를 들어

Cellphone(){ this.color = "black"; this.capacity = 32; }

'백엔드개발 > Java' 카테고리의 다른 글

[Java] 일급 컬렉션  (0) 2024.10.30
[JAVA] StringBuilder  (2) 2024.10.12
[JAVA] BufferedReader와 Bufferedwriter  (0) 2024.10.12
[JAVA] 멘토씨리즈 자바 Chapter7  (3) 2024.10.12
[Java] 멘토씨리즈 자바 Chapter02-Chapter05  (1) 2024.10.12