클래스
- 객체는 설계도를 바탕으로 만들어짐
- 설계도가 클래스
- 객체를 생성하기 위한 필드와 메서드가 정의되어 있음
- 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 함
- 클래스로부터 객체를 만드는 과정을 인스턴스화
클래스 선언
객체 생성과 클래스 변수
- 클래스로부터 객체를 생성하는 방법은 new 연산자 사용
- new 연산자로 생성된 객체(인스턴스)는 메모리 힙 영역에 생성됨
- new 연산자는 객체를 생성하고, 객체의 주소를 반환
클래스 변수명 = new 클래스();
클래스의 구성 멤버
필드(Field)
- 클래스 멤버 변수라고도 불림
- 객체의 고유 데이터를 저장하는 곳
- 선언 형태는 변수와 비슷
- 생성자와 메서드 전체에서 사용되며 객체가 소멸되지 않는 한 계속 존재
- 클래스 중괄호 안에선 어디어 있어도 괜찮음(생성자, 메서드 안에는 안됨)
- 도트 연산자(.)는 객체 접근 연산자로 객체가 가지고 있는 필드, 메서드를 사용할 때 사용
- this는 객체 자신의 참조
- 'this.필드'는 this란 참조변수로 필드를 사용하는 것과 동일
생성자(Constructor)
- new 연산자로 호출되는 특별한 중괄호 블록
- 객체 생성 시, 초기화를 담당
- 메서드와 비슷하지만 클래스 이름으로 되어있고 리턴 타입이 없음
- 모든 클래스는 생성자가 반드시 존재
- 하나 이상을 가질 수 있음
기본 생성자
- 클래스 내부에 생성자 선언을 생략하면 컴파일러가 기본 생성자를 자동 추가함
- 클래스 내부에 명시적으로 생성자를 1개라도 선언하면 기본 생성자를 추가하지 않음
생성자 오버로딩
- 다양한 방법으로 객체를 생성할 수 있도록 제공
- 매개변수를 달리하는 생성자를 여러개 선언하는 것
다른 생성자 호출, this()
- 필드 초기화는 한 생성자에게만 집중하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출
- 생성자에서 다른 생성자를 호출할 때 사용
- 생성자의 첫 줄에서만 허용됨
- this()의 매개값은 호출되는 생성자의 매개 변수 타입에 맞게 제공
메서드(Method)
- 객체의 동작에 해당하는 중괄호 블록
- 객체 간의 데이터 전달의 수단으로 사용됨
- 선언부와 실행블록으로 구성
- 클래스 내부에선 메서드명으로 호출 가능
- 클래스 외부에선 '변수명.메서드명' 호출
메서드 오버로딩
- 클래스 내에 같은 이름의 메소드를 여러개 선언하는 것
- 매개 변수의 타입, 개수, 순서 중 하나가 달라야 함
인스턴스 멤버와 this
- 인스턴스 멤버란 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메서드
- 인스턴스 필드와 인스턴스 메서드
정적 멤버와 static
- 정적 멤버는 클래스에 고장된 멤버
- 객체를 생성하지 않고 사용할 수 있는 필드와 메서드
- 정적 멤버는 객체가 아닌 클래스에 소속된 멤버
클래스 멤버라고 함
정적 멤버 선언
- 필드나 메서드 선언 시 static 키워드를 추가하면 됨
- 객체마다 가지고 있을 필요성이 없는 공용적 데이터를 정적 필드로 선언
- 인스턴스 필드를 이용하지 않는다면 정적 메서드로 선언
정적 멤버 사용
정적 초기화 블록
- 정적 필드는 선언과 동시에 초기화하는 것이 보통
- 정적 필드의 복잡한 초기화 작업을 위해 정적 블록(static block)을 제공
- 정적 블록은 클래스가 메모리로 로딩될 때 자동으로 실행됨
- 클래스 내부에 여러개가 선언되어도 상관없음
정적 메서드와 블록 선언 시 주의점
- 객체가 없어도 실행됨
- 내부에 인스턴스 필드나 메서드를 사용할 수 없음
- 정적 메서드와 블럭에서 인스턴스 멤버를 사용하려면 객체를 먼저 생성하고 참조 변수로 접근
- 객체 자신의 참조인 this 키워드 사용 불가능
싱글톤(Singleton)
- 전체 프로그램에서 단 하나의 객체(싱글톤)만 만들도록 보장해야 할 경우
- 싱글톤을 만드려면 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 함
- 생성자를 호출한 만큼 객체가 생성되므로
- 생성자 앞에 private 접근 제한자를 붙여주기
- 클래스 내부에선 new 연산자로 생성자 호출 가능
public Class 클래스 {
private static 클래스 변수명 = new 클래스();
private 클래스() {}
static 클래스 getInstance() {
return 변수명;
}
}
- 정적 필드를 선언하고 자신의 객체를 생성해 초기화
- 정적 필드도 private 접근 제한자를 붙여 외부에서 필드값을 변경 못하게 막기
- 외부에서 호출 가능한 메서드를 선언하여 정적 필드에서 참조하는 객체를 리턴
- 외부에서 객체를 얻는 방법은 getInstance() 메서드 호출하는 방법뿐
final 필드와 상수
final 필드
-
초기값이 저장되면 이것이 최종적인 값이 되어 프로그램 실행 도중에 변경 불가
final 타입 변수명 [= 초기값];
-
초기값을 줄 수 있는 방법 2가지
- 필드 선언 시에 주는 방법
- 생성자에서 주는 방법
-
final 필드를 초기화하지 않으면 컴파일 에러 발생
-
객체마다 저장되고, 생성자의 매개값에 따라 여러가지 값을 가짐
상수(static final)
- 불변의 값
- 공용성을 가지며, 여러 가지 값으로 초기화 불가능 <- final 필드는 상수가 아님
- static final 필드는 객체마다 저장되지 않고, 클래스에만 포함됨, 변경 불가능
- 상수 이름은 대문자로 작성하는 것이 관례
패키지
- 클래스를 체계적으로 관리하기 위해 패키지를 사용
- 클래스를 유일하게 만들어주는 식별자 역할
- 클래스 이름이 같아도 다른 패키짐녀 다른 클래스로 인지
패키지 선언
- 클래스를 컴파일하는 과정에서 자동적으로 생성되는 폴더
import문
- 같은 패키지에 속하는 모든 클래스는 아무 조건없이 다른 클래스 사용 가능
- 다른 패키지에 속하는 클래스를 사용하려면 해당 패키지를 import문으로 선언하고 클래스를 사용할 때 패키지를 생략
접근 제한자
public
- 공개한단 의미
- 외부 클래스가 자유롭게 사용 가능
protected
default
private
- 외부에 노출되지 않음(같은 패키지도 사용 불가)
접근 제한 | 적용할 내용 | 접근할 수 없는 클래스 |
---|
public | 클래스, 필드, 생성자, 메서드 | 없음 |
protected | 필드, 생성자, 메서드 | 하위 클래스가 아닌 다른 패키지에 소속된 클래스 |
default | 클래스, 필드, 생성자, 메서드 | 다른 패키지에 소속된 클래스 |
private | 필드, 생성자, 메서드 | 모든 외부 클래스 |
클래스 접근 제한
- public, default
- 클래스를 선언할 때 public을 생략하면 클래스는 default 접근 제한을 가짐
생성자 접근 제한
- public, protected, default, private
- 객체를 생성하기 위해선 new 연산자로 생성자를 호출애야 함
필드와 메서드 접근 제한
- public, protected, default, private
Getter와 Setter 메서드
- 객체 지향 프로그래밍에선 일반적으로 객체의 데이터는 객체 외부에서 직접 접근을 막음
- 객체의 무결성이 깨질 위험(외부에서 마음대로 읽고, 변경) 때문
- 메서드를 통해 데이터를 변경하는 것을 선호 <- Setter 메서드
- 메서드를 통해 데이터를 읽어오는 것을 선호 <- Getter 메서드
- 클래스를 선언할 때 필드를 private으로 외부로 부터 보호하고 필드에 대한 Getter, Setter 를 작성하여 사용
어노테이션
- 메타데이터(컴파일 과정과 실행 과정에서 어떻게 처리, 실행할지 알려주는 정보)
어노테이션 용도
- 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공
- 소프트웨어 개발 툴이나 빌드나 배치 시, 코드를 자동으로 생성할 수 있도록 정보 제공
- 실행(런타임) 시, 특정 기능을 실행하도록 정보 제공