읽은 책 정리/자바의정석 3판

[Java] Chapter06 객체지향언어

포포015 2021. 3. 22. 11:20

객체지향 언어의 역사

- 재사용성과 유지보수 그리고 중복된 코드의 제거에 중점적으로 고안되서 나온언어

 

클래스와 객체의 정의와 용도

- 클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된대로 생성됨

 

객체와 인스턴스

- 클래스로 부터 객체를 만드는과정을 클래스의 인스턴스화 라고하며,

 어떤 클래스로부터 만들어진 객체를 그클래스의 인스턴스라고 한다

 

객체의 구성요소

- 객체는 속성과 기능의 집합이라 할수 있다(멤버변수와 메서드)

 

인스턴스의 생성과 사용

- 참조변수에는 하나의 값 (주소)만이 저장될수 있으므로,

 둘이상의 참조변수가 하나의 인스턴스를 가리키는것(참조하는)것은 가능하지만 

 하나의 참조변수로 여러개의 인스턴스를 가리키는것은 가능하지 않다.

 

객체 배열

- 객체 역시 배열로 다루는것이 가능, TV [] tvArr = new TV[3]; 이라면,

 이객체 배열은 3개의 객체(객체의 주소를 저장할수 있다) -> 객체 선언후 객체를 생성해줘야한다.

 

클래스의 또다른 정의

- 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는것을 사용자정의타입이라고 한다.

 객체지향 언어에서는 클래스가 곧 사용자 정의타입이다.

 (참조형타입 개수가 정해져 있지않은 이유는 프로그래머가 새로운타입을 계속 추가할수 있기때문)

 

변수와 메서드

클래스 변수 - 클래스 인스턴스를 생성할때 만들어진다(클래스가 메모리에 올라갔을때) static int cv;

인스턴스 변수 - 클래스의 인스턴스를 생성할때 만들어진다(인스턴스가 생성되었을때) int iv;

지역변수 - 메서드내에서 선언되어 메서드내에서 사용가능 (메서드 종료시 자동 소멸)

 

메서드의 선언과 구현

- 메서드의 선언부는 반환타입 메서드이름 매개변수입력 순이다 

 일반적인 변수 선언과 달리, 두변수의 타입이 같아도 변수의 타입은 생략불가.

1
2
3
반환타입 메서드이름(파라미터)
int add(int x, int y){

int i result = x+y;
return result;
}
cs

메서드의 호출

int result = add(3,5) //인자로 부름

 

return 문

- 메서드의 반환 타입과 일치해야한다

 

매개변수의 유효성검사

'호출하는쪽에서 알아서 넘겨주겠지' 라는 생각 X 최대한 방어적코딩을 하자

 

JVM의 메모리구조

 1) 메서드 영역(static int cv)

 - JVM은 해당 클래스의 클래스 파일을 읽어서 , 클래스에 대한 정보를 이곳에 저장(이때 클래스의 클래스변수도 생성)

 2) 힙 영역

 - 인스턴스의 변수들이 생성되는 공간

 3) 호출스택(call stack)

 - 메서드의 작업에 필요한 메모리 공간 제공

 (메서드가 작업을 수행하는동안 지역변수들과 연산의 중간결과등을 저장, 메서드가 작업을 마치면 메모리공간을 반환) 

 

기본형 매개변수와 참조형 매개변수

- 매개변수 타입이 기본형일때는 기본형 값이 복사되고, 참조형이면 인스턴스의 주사고 복사됨

- 기본형 매개변수 -> 변수의 값을 읽기만 

- 참조형 매개변수 -> 변수의 값을 읽고 ,변경 까지 가능 (매개변수 타입이 배열이면 참조형 매개변수 임)

 

참조형 반환타입 

- 반환 타입이 참조형이라는것은, 메서드가 '객체의 주소'를 반환한다는것을 의미

 

재귀호출 

- 메서드 내부에서 메서드 자신을 호출하는것(반복문으로 커버가능)

 성능이나 여러부분이 별로지만, 논리적 간결함이 있다(잘안쓴다)

 

클래스 메서드(static메서드)와 인스턴스 메서드

- 변수와 똑같이 메서드 앞에 static이 붙어 있으면, 클래스 메서드. 붙어있지않으면 인스턴스 메서드 이다.

 클래스 메서드도 클래스 변수처럼 객체 생성하지 않아도, 클래스이름.메서드이름으로 호출가능

1) 멤버변수를 공통으로 사용하는것에 static을 붙인다.

2) 클래스 메서드(static메서드)는 인스턴스 변수를 사용할수 없다.

3) 메서드 내에서 인스턴스를 사용하지 않는다면 , static을 붙이는것을 고려

 

오버로딩 

- 한클래스 내에 같은 이름의 메서드를 여러개 정의 -> 오버로딩 메서드의 이름이 같아야함, 매개변수 개수 또는 타입이 달라야함

 

오버로딩의 장점

- println이 대표적인 예 이다.

근본적으로는 같은 기능을 해야하는 메서드들을 서로 다른이름으로 지으면 불편하다(메서드 이름을 절약)

 

생성자란?

- 인스턴스가 생성될때 호출되는, 인스턴스 초기화 메서드 이다

 

기본생성자

- 모든 클래스에는 반드시 하나 이상의 생성자가 정의 되어 있어야한다.

(생성자가 하나도 없을경우 컴파일러가 자동적으로 기본생성자를 추가)

 

매개변수가 있는 생성자

- 매개변수를 선언하여 호출시 값을 넘겨받아서, 인스턴스의 초기화 작업에 사용

 인스턴스를 생성한다음 인스턴스간의 변수의 값을 변경하는것보다, 매개변수를 갖는 생성자를 이용하는게 편함

 

생성자에서 다른생성자를 호출하기 - this(), this

- 생성자 간에도 서로 호출이 가능하다.

조건 2가지가 있다.

1)  생성자의 이름으로 클래스 이름대신 this를 사용

2) 한 생성자에서 다른생성자를 호출할때는 반드시 첫줄에서 호출가능

 

참조변수 this와 생성자 this()

- this는 인스턴스 자신을 가르키는 참조변수(지역변수, 인스턴스 변수를 구분할때 사용)

- this()는 생성자에서 다른생성자를 호출할때 사용(반드시 첫줄에서만 사용)