TIL 20-04-05
Updated:
혼자 공부하는 자바 - chap6 클래스
06-1 객체 지향 프로그래밍
객체란?
물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중 자신의 속성을 가지고 있으면서 식별 가능한 것. 속성과 동작으로 구성되어있고, 자바에서는 각각 필드와 메소드라 부른다.
객체의 상호작용
현실 세계의 모든 현상은 객체와 객체 간의 상호작용으로 이루어져 있다. 객체들 사이의 상호작용 수단은 메소드이고, 객체의 다른 객체의 기능을 이용하는 것이 메소드 호출이다.
메소드 호출의 형태
리턴값 = 전자계산기객체.메소드(매개값1, 매개값2…)
- 객체에 도트(.) 연산자를 붙이고 메소드 이름을 기술. 도트 연산자는 객체의 필드와 메소드에 접근할 때 사용.
- 매개값은 메소드를 실행하기 위해 필요한 데이터. 리턴값은 메소드가 실행되고 난 후 호출된 곳으로 돌려주는 값.
객체와 클래스
자바에서는 설계도가 바로 클래스. 클래스로부터 만들어진 객체가 해당 클래스의 인스턴스. 하나의 클래스로부터 여러 개의 인스턴스를 만들 수 있다. 동일한 설계도로 여러 대의 자동차를 만든 것과 같다.
클래스 선언
서로 다른 단어가 혼합된 이름을 사용한다면 각 단어의 첫 글자는 대문자로 작성하는 것이 일반적. 일반적으로 소스 파일당 하나의 클래스를 선언함. 2개 이상의 클래스가 선언된 소스 파일을 컴파일하면 클래스를 선언한 개수만큼 생김. 결국 소스파일은 클래스 선언을 담고 있는 저장 단위이다.
객체 생성과 클래스 변수
클래스 변수 = new 클래스();
- 클래스로부터 객체를 생성하려면 new 연산자를 사용하면 된다.
- 클래스로 선언된 변수에 new 연산자가 리턴한 객체의 번지를 저장하는 코드.
클래스의 구성 멤버
- 필드 : 객체의 데이터가 저장되는 곳
- 생성자 : 객체 생성 시 초기화 역할 담당
- 메소드 : 객체의 동작에 해당되는 실행 블록
용어 정리
- 클래스 : 객체를 만들기 위한 설계도
- 객체 : 클래스로부터 생성되면 new 클래스()로 생성
- new 연산자 : 객체 생성 연산자이며, 생성자를 호출하고 객체 생성 번지를 리턴함.
- 클래스 변수 : 클래스로 선언한 변수를 말하고 해당 클래스의 객체 번지가 저장됨.
- 클래스 멤버 : 클래스에 선언되는 멤버는 필드, 생성자, 메소드
06-2 필드
필드란?
객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 데이터를 저장하는 곳
필드 선언
필드 선언은 클래스 중괄호 {} 블록 어디서든 존재할 수 있다. 생성자 선언과 메소드 선언의 앞과 뒤 어떤 곳에서도 선언이 가능함.
필드 사용
클래스 외부에서 사용할 경우 반드시 객체를 생성하고 참조 변수를 통해 사용해야 함. 이유는? 필드가 객체에 소속된 데이터이므로 객체가 존재하지 않으면 필드도 존재하지 않기 때문.
Car myCar = new Car();
myCar 변수가 Car 객체를 참조하게 되면 도트 연산자를 사용해서 speed 필드에 접근할 수 있다.
06-3 생성자
생성자와 객체 초기화
- 생성자 : new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당.
- 객체 초기화 : 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것.
기본 생성자
모든 클래스는 생성자가 반드시 존재하며, 생성자를 하나 이상 가질 수 있다. 명시적으로 생성자를 선언하는 이유는 객체를 다양한 값으로 초기화하기 위해서다.
생성자 선언
클래스에 생성자가 명시적으로 선언되어 있을 경우엔 반드시 선언된 생성자를 호출해서 객체를 생성해야 한다.
필드 초기화(sec03.exam02)
필드를 선언할 때 초기화를 주거나 생성자에서 초기화를 줄 수 있다. 객체 생성 시점에 외부에서 제공되는 다양한 값들로 초기화되어야 한다면 생성자에서 초기화 해야함.
this.필드
통상적으로 필드와 동일한 이름을 갖는 매개 변수를 사용함. this는 객체 자신의 참조인데, 우리가 우리 자신을 ‘나’라고 하듯이 객체가 자기 자신을 this라고 함.
public Korean(String name, String ssn) {
this.name = name;
this.ssn = ssn;
}
생성자 오버로딩
매개변수를 달리하는 생성자를 여러 개 선언하는 것. 이때, 매개 변수 이름만 바꾸는 것은 생성자 오버로딩이 아님.
public class 클래스{
클래스 ([타입 매개변수, ...]}
//[생성자의 오버로딩] : 매개변수의 타입, 개수, 순서가 다르게 선언
클래스 ([타입 매개변수, ...]){
}
}
다른 생성자 호출
- 매개변수의 수만 달리하고 필드 초기화 내용이 비슷한 생성자일 경우, 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 자기고 있는 생성자를 호출하는 방법으로 개선.
- this()는 자신의 다른 생성자를 호출하는 코드로 반드시 생성자의 첫 줄에서만 허용됨.
Car(String model){
this(model, "은색", 250);
}
Car(String model, String color){
this(model, color, 250);
}
Car(String model, String color, int maxSpeed){
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed; //공통 실행 코드
}
용어 정리
- 기본 생성사 : 클래스 선언 시 컴파일러에 의해 자동으로 추가되는 생성자.
- 생성자 선언 : 클래스로부터 객체를 선언할 때 호출되는 생성자를 명시적으로 선언할 수 있다.
- 매개 변수 : 생성자 호출 시 값을 전달받기 위해 선언되는 변수.
- 객체 초기화 : 객체를 사용하기 전에 준비하는 과정으로 필드를 선언할 때 초기화하거나 생성자 내부에서 필드값을 초기화할 수 있으며, 메소드를 호출하는 내용으로 구성됨.
- 오버로딩 : 매개 변수를 달리하는 생성자를 여러 개 선언하는 것.
- this() : 객체 자신의 또 다른 생성자를 호출할 때 사용.