
5일차 TIL은 자바 - 객체와 클래스에 대해 공부할 계획이다.
- 클래스(Class)는 객체를 생성하기 위한 필드와 메서드가 정의되어있다.
- 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 한다.
클래스의 구성 멤버에는 필드, 생성자, 메서드가 있다.
- 필드 : 객체가 가지고 있어야 할 속성으로 데이터를 저장하는 역할
- 생성자 : 객체를 생성하는 방식으로 반환 타입이 없고 클래스의 이름과 동일
- 메서드 : 객체가 가지고 있어야 할 행위 반환 타입이 있다.
따라서 클래스를 만들려면 위의 내용을 포함하여
클래스 선언 - 필드 생성 - 생성자 정의 - 메서드 정의
의 과정이 필요하다.
객체 생성은 키워드 new를 사용하여 클래스로부터 객체를 생성할 수 있다.
Car bmw = new Car();
여기서 Car는 클래스 이름, bmw는 인스턴스의 이름이다.
new를 통해 객체가 생성되고, 클래스 내부의 Car()라는 기본 생성자가 호출 된다.
3일차였나 4일차였나 new는 참조형 변수를 생성한다고 적었던 기억이 있는데 여튼 객체가 생성되면 인스턴스의 주소가 반환되기 때문에 클래스 내부의 참조형 변수를 사용할 수 있다.
객체가 가지고 있어야 할 속성으로 데이터를 저장하는 역할 이라고 정의를 했었다.
여기서 데이터는 크게 고유 데이터, 상태 데이터, 객체 데이터로 분류할 수 있다.
필드의 생성 위치는 클래스의 {} 중괄호 안에서는 어디든 선언이 가능하지만, 메서드나 생성자의 안에서는 생성할 수 없다.
필드는 기본적으로 초기값을 제공받지 못할 경우 객체가 생성될 때 자동으로 각 타입에 맞는 기본값을 가지게 된다.
객체를 생성한 후 외부 클래스에서 객체 내부의 필드에 접근할 때 사용하며 (.) 연산자를 사용하여 접근한다.
Car bmw = new Car();
bmw.color = "blue";
내부에서 접근하여 객체 내부 메서드에서 필드에 접근할 수 있다.
Public class Car() {
/* 필드 선언부 */
double speed = 0.0;
/* 생성자 */
public Car() {}
/* 메서드 */
double speedUP() {
speed += 20.24;
return speed;
}
}
내부의 double speedUP() 메서드를 통해 필드 speed에 접근했다.
객체간의 협력을 위해 사용된다.
메서드를 정의하는 방법은 {}내부에 실행할 행위를 적는다.
return_type method_name(parameter) {
실행할 코드 작성
}
double speedUP() {
speed += 20.24;
return speed;
}
리턴값이 없는 경우 리턴타입을 void로 선언해야 한다.
메서드를 호출할 때 메서드에 값을 전달하기위한 변수.
가변 매개변수도 선언이 가능하다.
double speedUP(double ... speeds) {
for(double value : speeds){
speed += value;
}
}
메서드 역시 객체생성 후 사용이 가능하다.
외부 클래스에서 객체를 생성했다면 . 연산자를 통해 필드에 접근한 것 처럼 메서드에 접근이 가능하다.
Car bmw = new Car();
bmw.speedUP();
메서드가 매개 변수를 받는다면 () 안에 매개변수를 넣어주면 된다.
내부 메서드에서 내부 메서드로 접근하여 호출이 가능하다.
메서드 오버로딩이란
- 같은 이름을 가진 메서드들이 매개변수의 갯수, 타입, 순서가 다른 경우 허용되는 것을 말한다.
- 매개변수의 차이로만 메서드의 오버로딩이 결정된다.
일단 멤버란 필드와 메서드를 합친 것을 멤버라 한다.
- 인스턴스 멤버 = 인스턴스 필드 + 인스턴트 메서드
- 클래스 멤버 = 클래스 필드 + 클래서 메서드
인스턴스 멤버는 객체 생성 후에 사용할 수 있고, 클래스 멤버는 객체 생성 없이도 사용이 가능
- 필드와 메서드를 클래스 멤버로 만들기 위해서는 static 키워드를 선언해줘야 한다.
- 모든 인스턴스가 필요로하지 않는 공용적인 데이터는 클래스 멤버로 선언하는것이 좋다.
- 인스턴스 필드를 필요로 하지 않는 메서드는 static 키워드를 통해 클래스 메서드로 선언하는 것이 좋다.
생성자는 객체가 생성될 때 호출되며 객체의 초기화 역할을 수행한다.
- 객체를 생성자를 선언할 때 parameter 자리에 아무것도 넣지 않은 기본적인 생성자를 말한다.
- 생성자를 하나도 선언하지 않은 경우 컴파일러가 자동으로 생성자를 선언해주지만 하나라도 선언이 되어있다면 기본 생성자가 선언되지 않는다.
객체를 만들 때 인스턴스마다 다른 값을 가져야 한다면 생성자를 통해 필드를 초기화 할 수 있다.
이때 기본생성자는 parameter가 비어있지만 필드 초기화를 할 경우 parameter를 넘겨 인스턴스를 생성하는 방식이다.
이렇게 생성자를 통해 필드를 초기화 할 때 메서드 처럼 오버로딩을 적용할 수 있다.
Public class Car() {
/* 필드 선언부 */
static String color = "black";
/* 생성자 */
public Car() {}
public Car(String color) {
this.color = color;
}
}
처럼 같은 이름의 생성자여도 매개변수의 유무나 갯수에 따라 오버로딩이 가능하다.
필드의 초기값 참고 : https://hunit.tistory.com/154