Java의 대표적인 객체 지향 구성 요소는 _클래스_예요. 클래스는 데이터(필드, 인스턴스 변수라고도 해요)와 동작(메서드)을 함께 묶은 것이에요. 클래스의 필드와 메서드를 _멤버_라고 불러요.
멤버에 대한 접근은 접근 제어자로 제어할 수 있는데, 가장 흔히 쓰이는 두 가지는 다음과 같아요:
Java에서 접근 제어자를 지정하지 않으면 기본값은 _패키지 가시성_이에요. 이 경우 멤버는 같은 패키지에 정의된 모든 클래스에서 볼 수 있어요.
이렇게 관련 있는 데이터와 동작을 묶고 멤버에 대한 접근을 제한하는 것을 캡슐화라고 해요. 캡슐화는 객체 지향의 핵심 개념 중 하나예요.
클래스는 그 클래스의 인스턴스를 만들기 위한 틀이라고 생각하면 돼요.
클래스의 인스턴스를 만드는 것(_객체_라고도 해요)에는 new 키워드를 사용해요:
class Car {
}
// Create two car instances
Car myCar = new Car();
Car yourCar = new Car();
필드에는 타입과 이름이 있고(camelCase 표기법을 써요), 클래스 안 어디에든 정의할 수 있어요(PascalCase 표기법을 써요).
class Car {
// Accessible by anyone
public int weight;
// Only accessible by code in this class
private String color;
}
필드에는 초깃값을 선택적으로 지정할 수 있어요. 필드에 초깃값을 지정하지 않으면 그 타입의 기본값으로 설정돼요. 인스턴스의 필드 값은 점 표기법으로 읽고 바꿀 수 있어요.
class Car {
// Will be set to specified value
public int weight = 2500;
// Will be set to default value (0)
public int year;
}
Car newCar = new Car();
newCar.weight; // => 2500
newCar.year; // => 0
// Update value of the field
newCar.year = 2018;
private 필드는 보통 메서드를 호출하는 부수 효과로 갱신해요.
이런 메서드는 보통 아무 값도 반환하지 않는데, 이때 반환 타입은 void로 지정해야 해요:
class CarImporter {
private int carsImported;
public void importCars(int numberOfCars)
{
// Update private field
carsImported = carsImported + numberOfCars;
}
}
Java 클래스에서는 public 필드를 쓰는 것이 관례가 아니에요. 보통 private 필드를 쓰고, _게터_와 세터를 통해 접근해요.
클래스 안에서 this 키워드는 현재 클래스를 가리켜요.
매개변수가 필드와 이름이 같을 때 특히 유용해요:
class CarImporter {
private int carsImported;
public void setImportedCars(int carsImported)
{
// Update private field from public method
this.carsImported = carsImported;
}
}