클래스는 설계도다
지금까지 여러분의 코드는 단순한 값을 주고받는 메서드 안에 머물러 있었습니다. 클래스를 사용하면 서로 관련된 데이터와 그 데이터를 다루는 동작을 하나의 이름 있는 타입으로 묶을 수 있습니다. 클래스는 설계도이고, 실제로 다루는 대상은 그것으로부터 생성된 객체입니다.
클래스는 두 종류의 멤버를 선언합니다. 필드(각 객체가 보유하는 데이터)와 메서드(각 객체가 할 수 있는 일)입니다.
new Dog()는 메모리에 객체를 만들고 그것에 대한 참조를 돌려줍니다. d.name과 d.bark()는 바로 그 특정 객체에 접근합니다.
각 객체는 자신만의 상태를 가진다
클래스의 핵심은 각각 자신만의 필드 값을 지닌 여러 독립적인 객체를 찍어 낼 수 있다는 점입니다. 하나를 바꿔도 다른 것에는 결코 영향을 주지 않습니다.
rex와 bella는 서로 다른 두 객체입니다. 각자 자신의 name을 가지므로 각 bark()는 서로 다른 값을 출력합니다. 이렇게 객체마다 갖는 데이터를 인스턴스 상태라고 부릅니다.
필드와 메서드는 함께 동작한다
클래스 안의 메서드는 그 객체 자신의 필드를 매개변수로 넘길 필요 없이 직접 읽고 갱신할 수 있습니다. 메서드는 이미 자신이 다루는 데이터를 가진 객체 "위에 존재"합니다.
increment()가 인수를 하나도 받지 않는다는 점에 주목하세요. 이 메서드는 여러분이 호출한 그 Counter에 속한 필드에 대해 동작합니다. 이것이 클래스 메서드와 동떨어진 정적 메서드의 차이입니다. 메서드에는 작용할 대상이 되는 암묵적인 객체가 있습니다.
this 키워드
메서드 안에서 this는 그 메서드가 호출된 객체에 대한 참조입니다. 보통은 필요하지 않습니다. count라고만 써도 이미 this.count를 뜻하기 때문입니다. 하지만 매개변수 이름이 필드 이름과 충돌할 때 this는 필수가 되며, 이는 세터와 생성자에서 끊임없이 일어납니다.
초보자가 흔히 저지르는 실수는 move 안에서 x = x;라고 쓰는 것입니다. 이것은 매개변수를 자기 자신에게 대입할 뿐 필드는 건드리지 않습니다. 컴파일러는 경고하지 않고, 객체는 조용히 예전 값을 유지합니다. 필드를 실제로 갱신하는 것은 this.x = x;입니다.
필드 기본값과 null 참조
객체를 생성하면 그 필드가 쓰레기 값으로 남지 않습니다. 자바는 기본값으로 초기화합니다. 숫자는 0, boolean은 false, String 같은 객체 참조는 null입니다. 이 null 기본값이 전형적인 충돌의 원인입니다.
아무도 설정하지 않았기 때문에 u.name은 null이고, 그 위에서 .length()를 호출하면 NullPointerException이 발생합니다. 필드를 사용하기 전에 항상 객체에 의미 있는 값을 할당하세요. 바로 이것이 생성자가 해결하는 문제입니다.
클래스를 중심으로 코드 구성하기
실제 프로그램은 데이터와 그에 대한 연산을 함께 담는 클래스로 도메인을 모델링합니다. 여기서 하나의 BankAccount 클래스가 잔액을 보관하고 그것이 어떻게 바뀌는지 통제합니다.
데이터(balance)와 그것을 바꾸는 규칙(deposit, withdraw)이 한곳에 모여 있습니다. 다른 곳의 코드는 계좌의 숫자를 직접 건드리지 않고 계좌에게 일을 해 달라고 요청합니다. 이것이 깔끔하고 유지보수하기 좋은 설계의 토대입니다.
다음: 생성자
new 뒤에서 모든 필드를 손으로 설정하는 일은 번거롭고 잊어버리기 쉽습니다. 그리고 방금 보았듯이 잊어버린 필드는 충돌을 기다리는 null을 남깁니다. 생성자를 사용하면 객체가 생성되는 바로 그 순간에 필드를 필수로 요구하고 초기화할 수 있어, BankAccount가 소유자 없이는 결코 존재할 수 없게 만듭니다. 그것이 다음 페이지의 내용입니다.
자주 묻는 질문
자바에서 클래스란 무엇인가요?
클래스는 어떤 종류의 객체가 가질 데이터(필드)와 동작(메서드)을 정의하는 설계도입니다. 클래스 자체는 템플릿일 뿐이며, 실제 객체는 new로 그것에서 생성합니다. 예를 들어 Dog 클래스는 모든 개가 name을 가지고 bark()할 수 있다고 기술하며, 각 new Dog()는 저마다의 이름을 가진 별개의 개입니다.
자바에서 클래스와 객체의 차이는 무엇인가요?
클래스는 정의이고, 객체는 그 정의로부터 new로 만들어진 구체적인 인스턴스입니다. 하나의 Person 클래스로 여러 개의 Person 객체를 만들 수 있으며, 각 객체는 자신만의 필드 값을 가집니다. 클래스를 쿠키 틀로, 객체를 개별 쿠키로 생각하세요. 한 객체의 필드를 바꿔도 다른 객체에는 결코 영향을 주지 않습니다.
자바 클래스에서 this 키워드는 무슨 일을 하나요?
this는 현재 객체, 즉 그 메서드가 실행되고 있는 특정 인스턴스를 가리킵니다. 객체 자신의 필드에 접근할 때 사용하며, 특히 매개변수 이름이 필드 이름과 같을 때(this.name = name;) 유용합니다. this가 없으면 그 대입은 매개변수를 자기 자신에게 대입할 뿐이어서 필드는 그대로 남게 됩니다.