객체 : 세상에 존재하는 물체, 식별이 가능한 것, 속성과 행위로 구성
객체지향 : 소프트웨어를 하나씩 조립해서 하나의 완성된 프로그램을 구성
객체끼리의 상호작용 : 메서드를 통해 이루어짐
객체 간의 관계
객체와 클래스
클래스 구성 : 필드, 생성자, 메서드
클래스 설계 과정
1. 클래스 선언
2. 속성(필드) 정의
3. 객체 생성 방식(생성자) 정의
4. 객체가 가지고 있어야 할 행위(메서드) 정의
//예시 자동차 클래스
public class Car {
private String model; // 자동차 모델 변수
public Car() {} // 기본 생성자
public void horn() { // 메서드
System.out.println("빵빵");
}
}
생성
new Car(); // Car 클래스 객체 생성
참조형 변수
Car car1 = new Car(); // Car클래스의 객체인 car1 인스턴스 생성
Car car2 = new Car(); // Car클래스의 객체인 car2 인스턴스 생성
필드 : 객체의 데이터를 저장, 크게 고유 데이터, 상태 데이터, 객체 데이터로 분류
필드 사용 : 필드의 값을 변경하거나 읽는 것, 실제로 필드의 데이터를 가지고 있는 것은 객체이므로 객체를 생성한 후에 필드 사용 가능
car.color = "blue"
메서드 : 객체간의 협력을 위해 사용, 블록 내부에 실행할 행위를 정의하며 리턴 타입과 매개변수 지정이 필요 (생략 가능)
메서드 호출 : 메서드에 작성된 코드 실행, 필드와 마찬가지로 객체 생성 후 호출 가능
오버로딩
매개변수
필드와 메서드는 선언하는 방법에 따라 인스턴스 멤버와 클래스 멤버로 구분 (멤버 = 필드 + 메서드)
인스턴스 멤버
클래스 멤버
static
키워드 사용 / 일반적으로 공용적인 데이터를 저장하는 필드는 클래스 멤버로 선언, 인스턴스 필드를 사용하지 않고 실행되는 메서드는 클래스 메서드로 선언지역 변수 : 메서드 내부에 선언한 변수로 메서드가 종료될 때가지만 값이 유지됨
final 필드 : 해당값을 프로그램 실행 도중에 수정 불가
상수 : 값이 반드시 한 개이며 불변함
static final
: 모든 인스턴스가 공유할 수 있는 값이 한 개이며 불변인 상수 선언생성자 : 객체가 생성될 때마다 호출되며 객체를 초기화하는 역할
기본 생성자 : 선언할 때 매개변수가 없이 선언되는 생성자, 생성자를 선언하지 않았다면 자동으로 추가됨
생성자 오버로딩 : 필드 초기화시 오버로딩을 사용하여 효율적 처리 가능
인스턴스마다 다른 값을 가져야 한다면 생성자를 통해 필드를 초기화
↔ 인스턴스마다 동일한 값을 가진다면 초기값 대입
public Car(String modelName) {
model = modelName;
}
public Car(String modelName, String colorName) {
model = modelName;
color = colorName;
}
public class Main {
public static void main(String[] args) {
Car car1 = new Car("GV60");
Car car2 = new Car("GV70", "Blue");
}
}
this
return this;
를 사용하여 자신의 주소 반환 가능this()
public Car(String model, String color) {
this(model, color, 100000000); // 아래의 생성자 호출
}
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미 부여
접근 제어자는 클래스 내부에 선언된 데이터를 보호하기 위해 사용 (캡슐화), 객체를 변경이 없는 상태로 유지하기 위해 사용 (무결성)
public
, protected
, default
, private
static
, final
, abstract
public
: 접근 제한 없음
protected
: 같은 패키지 내, 다른 패키지의 자손 클래스에서 접근 가능
default
: 같은 패키지 내에서만 접근 가능
private
: 같은 클래스 내에서만 접근 가능
사용 가능 접근 제어자
public
, default
public
, protected
, default
, private
사용 가능 제어자
public
, default
, final
, abstract
public
, protected
, default
, private
, final
, abstract
, static
public
, protected
, default
, private
, final
, static
final
⚠️ 제어자 사용 주의 사항
static
과 abstract
동시 사용 불가abstract
와 final
동시 사용 불가abstract
메서드의 접근 제어자가 private
일 수 없음private
와 final
을 같이 사용할 필요 없음객체의 private 필드를 읽어오거나 저장하기 위해 사용
규칙 : get/set + 필드 이름
Getter : 외부에서 객체의 private 필드를 읽어올 때 사용
public String getModel() {
return model;
}
Setter : 외부에서 객체의 private 한 필드를 저장/수정할 필요가 있을 때 사용
public void setModel(String model) {
this.model = model;
}
packge(패키지) : 클래스의 일부분이면서 클래스를 식별해주는 용도
상위 패키지와 하위 패키지를 도트(.)로 구분
import : 다른 패키지에 있는 클래스를 사용하기 위해 명시하는 키워드