본글은 'Do it 자바 완전 정복' 책을 통한 공부내용을 정리한 글입니다.
클래스의 개념
객체는 사용할 수 있는 실체를 의미하며, 클래스는 객체를 만들기 위한 설계도와 같다. 따라서 1개의 정의된 클래스를 이용해 여러 개의 객체를 만들 수 있다. 클래스는 다양한 자료형의 데이터를 묶어 관리할 수 있을 뿐 아니라 데이터를 처리하는 다양한 기능까지 함께 관리하는 문법요소다.
자바에서 제공하는 객체지향 문법 요소는 크게 클래스와 인터페이스가 있고, 클래스는 다시 일반 클래스와 추상 클래스로 나뉜다
클래스 구조
클래스 정의 방법은 아래의 코드와 같다. 클래스는 class 키워드와 함께 클래스명을 표기한다. 클래스명은 대문자로 시작하는 것이 관례다.(개발자들 간의 확고한 약속이다.)
package ...; // 패키지
import ...; // 임포트
class 클래스명 {...} // 외부 클래스
public class A {
int a = 3; // 필드
double abc() {...} // 메서드
A() {...} // 생성자
class 클래스명 {...} // 이너 클래스
}
자바 소스 파일은 클래스의 외부 구성 요소와 내부 구성 요소로 나눠 생각할 수 있다.
클래스 외부 구성 요소
클래스의 외부에는 다음 3가지 구성 요소만 올 수 있다.
패키지(package)
프로젝트를 생성할 때 패키지를 지정했다면 이 구성 요소에 패키지명이 포함되며, 반드시 주석을 제외하고 첫번째 줄에 위치해야 한다. 클래스의 생성 과정에서 패키지를 생성하지 않았다면, 즉 디폴트 패키지를 사용하면 생략된다.
임포트(import)
다른 패키지의 클래스를 사용하고자 할 때 포함된다. 이클립스에서 ctrl+shift+o를 이용해 외부 패키지에 위치하고 있는 클래스를 자동으로 임포트 할 수 있다
외부 클래스(external class)
클래스의 외부에 또 다른 클래스가 포함될 수 있다. 단, 외부 클래스에는 public 키워드를 붙일 수 없다.
클래스 내부 구성 요소
클래스 내부에는 4가지의 구성 요소가 포함될 수 있다.
필드(field)
클래스의 특징(속성)을 나타내는 변수다.
메서드(method)
클래스가 지니고 있는 기능(함수)를 나타낸다.
생성자(constructor)
생성자는 클래스의 객체를 생성하는 역할을 담당한다.
이너 클래스(inner class)
클래스의 내부에도 클래스가 포함될 수 있다. 이를 이너 클래스라고 한다.
내부에 올 수 있는 구성 요소들 중 생성자를 제외한 3가지 요소를 클래스의 멤버라고 한다.
클래스와 객체의 구분
우리는 클래스를 직접 사용할 수 없다. 클래스의 모든 특징(필드)과 기능(메서드)들을 사용하려면 클래스를 이용해 객체를 만든 후 그 객체 속의 필드와 메서드 등을 사용해야 하는 것이다. 클래스에서 객체를 만드는 과정은 생성자가 수행한다. 클래스의 생성자로 객체를 만드는 과정을 인스턴스화(instantiation)라고 하고, 인스턴스화로 만들어진 객체를 인스턴스(instance)라고 한다. 객체 속에는 클래스의 내부 구성 요소 중 생성자를 제외한 나머지 요소가 포함되어 있는데 이를 인스턴스 멤버(instance member)라고 한다.
객체의 생성과 활용
클래스로 객체를 생성하고 활용하는 방법에 대해 알아보자.
객체 생성하기
객체는 new
키워드로 생성할 수 있다. 클래스에 따라 메서드를 사용해 객체를 생성할 때도 있지만 이때도 해당 메서드 내부에서 new
를 사용해 객체를 생성한다.
클래스명 참조변수명 = new 생성자();
A a = new A();
// A() 생성자로 만든 객체를 힙 메모리에 넣고, 위칫값을 A타입의 참조 변수 a에 저장
객체 활용하기
객체를 활용한다는 것은 객체 내부의 멤버를 사용한다는 의미다.
자바에서는 힙 메모리에 직접 접근할 수 있는 방법이 없으며, 위치 정보를 포함하고 있는 참조 변수를 이용해서만 객체에 접근할 수 있다. 이때 사용하는 것이 포인트 연산자(.)다. 포인트 연산자를 이용해 객체 내부의 멤버를 활용하는 방법은 다음과 같다.
참조 변수명.필드명
참조 변수명.메서드명()
A a = new A();
System.out.print(a.m); // a객체의 m필드 활용
a.print(); // a 객체의 print() 메서드 호출