- 생성자를 통해 변수에 객체를 할당하는 과정
- 실제로 변수에는 인스턴스가 아닌 참조값이 들어간다는 걸 명심
Student student = new Student(); // 1. Student 객체 생성
Student student = x001; // 2. new Student()의 결과로 x001 참조값 반환
student1 = x001; // 3. 최종 결과
- 기본형
- int, long, double, boolean처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입
- 모두 소문자로 시작, 클래스는 대문자로 시작
- null을 할당할 수 없음
- 참조형
- Student와 같이 데이터에 접근하기 위한 참조를 저장하는 데이터 타입
- 변수대입
- 자바는 항상 변수의 값을 복사해서 대입
- 메서드 호출
- 매개변수에 값을 전달할 때도 변수의 값을 복사해서 전달
- 변수의 값 초기화
- 멤버 변수는 자동 초기화
- 지역 변수는 수동 초기화
- 객체 생성 후 객체를 초기화하기 위한 특별한 메서드
- 장점
- 중복 호출 제거
- 생성 직후 초기화를 위한 메서드를 실행하지 않아도 됨
- 필수값 입력 보장 가능
- 중복 호출 제거
- 기본 생성자
- 매개변수가 없는 생성자
- 클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 자동으로 추가
- 생성자가 하나라도 있으면 자바는 기본 생성자를 만들지 않음
- Recursive constructor call
- 생성자에서 자기 자신을 호출하거나 다른 생성자를 호출했는데 다시 원래 생성자를 호출하는 경우
- 해결 방법
- 생성자 호출이 자기 자신을 반복하지 않도록 구조 수정
- 생성자 체이닝 시 종료 지점을 반드시 만들기
- 패키지 규칙
- 패키지의 이름과 위치는 폴더 위치와 같아야 함 (필수)
- 패키지 이름은 모두 소문자로 시작 (관례)
- 패키지 이름의 앞 부분에는 일반적으로 회사의 도메인 이름을 거꾸로 사용 (관례)
- com.companyname.myapp
- 접근 제어자 세부 사항
- private
- 나의 클래스 안으로 속성과 기능을 숨길 때 사용
- 외부 클래스에서 해당 기능을 호출할 수 없음
- default
- 나의 패키지 안으로 속성과 기능을 숨길 때 사용
- 외부 패키지에서 해당 기능 호출할 수 없음
- protected
- 상속 관계로 속성과 기능을 숨길 때 사용
- 상속 관계가 아닌 곳에서 해당 기능 호출할 수 없음
- public
- 기능을 숨기지 않고 어디서든 호출할 수 있게 공개
- private
- 클래스 레벨의 접근 제어자 규칙
- 클래스는 public 또는 default만 가능
- public 클래스는 반드시 파일 이름과 동일해야 함
- public 클래스는 반드시 하나만 존재해야 함
- default 클래스는 무한정 존재할 수 있음
- 캡슐화
- 데이터를 숨겨라
- 꼭 필요한 기능 제외 나머지 기능은 숨겨라
- 자바 메모리 구조
- 메서드 영역
- 프로그램을 실행하는데 필요한 공통 데이터 관리
- 클래스 정보, 상수, static 변수 저장
- 스택 영역
- 자바 실행 시 하나의 스택 영역이 생성
- 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함
- 스택 프레임이란 메서드를 호출할 때마다 생성되는 메모리 블록
- 힙 영역
- 객체와 배열이 생성되는 영역
- GC(가비지 컬렉션)에 의해 관리
- 메서드 영역
- static 변수
- 인스턴스와 무관하게 클래스에 바로 접근해서 사용 가능
- 클래스 자체에 소속되어 있어 클래스 변수라고도 함
- 클래수 변수는 자바 프로그램을 시작할 때 딱 1개가 만들어짐
- 인스턴스와 다르게 보통 여러 곳에서 공유하는 목적으로 사용
- 정적 메서드가 인스턴스의 기능을 사용할 수 없는 이유
- 정적 메서드는 클래스의 이름을 통해 바로 호출 가능
- 그래서 인스턴스처럼 참조값의 개념이 없음
- 그렇기 때문에 인스턴스의 기능을 사용할 수 없음
- 정적 메서드 활용
- 객체 생성이 필요 없이 메서드의 호출만으로 필요한 기능을 수행할 때 사용
- 유틸리티성 메서드
- 유틸리티성 메서드만 있는 클래스의 경우, 생성자를 private로 선언하여 인스턴스 생성을 막는 것이 일반적
- 특정 변수의 값을 할당한 이후에 변경하지 않을 경우 사용하는 키워드
- 코드 내에서 변경을 한다면 컴파일러가 오류를 발생시킴
- 기존 클래스의 필드와 메서드를 새로운 클래스에서 재사용하게 해줌
- 상속 사용을 위해서는 extends 키워드를 사용
- 클래스 계층 구조가 복잡해지는 걸 막기 위해 Java에서는 단일 상속만 지원
- 이를 해결하기 위해 인터페이스의 다중 구현을 허용
- 상속과 메모리 구조
- 상속 관계의 객체를 생성하면 그 내부에는 부모와 자식이 모두 생성된다
- 상속 관계의 객체를 호출할 때, 대상 타입을 정해야 함. 이 때 호출자의 타입을 통해 대상 타입을 찾음.
- 현재 타입에서 기능을 찾지 못하면 상위 부모 타입으로 기능을 찾아서 실행. 기능을 찾지 못하면 컴파일 오류 발생
- 오버라이딩
- 부모의 기능을 자식이 재정의할 경우 사용
- 애노테이션을 통해 오버라이딩을 명시할 수 있음
- 오버로딩과 오버라이딩
- 메서드 오버로딩
- 메서드 이름이 같고 매개변수가 다른 메서드를 여러 개 정의하는 것
- 메서드 오버라이딩
- 하위 클래스에서 상위 클래스의 메서드를 재정의하는 것
- 메서드 오버로딩
- 생성자
- 상속 관계의 생성자 호출은 결과적으로 부모에서 자식 순서로 실행
- 부모 데이터 초기화 후 자식 데이터 초기화
- 상속 관계에서 자식 클래스의 생성자 첫줄에 반드시 super()가 있어야 함
- 기본 생성자의 경우 생략 가능
- 클래스와 메서드에 사용되는 final
- 상속 및 오버라이딩 제한
- final 클래스는 상속할 수 없음
- final 메서드는 오버라이딩할 수 없음
- 상속 및 오버라이딩 제한
- 다형성
- 한 객체가 여러 타입의 객체로 취급될 수 있는 능력
- 다형적 참조: 하나의 변수 타입으로 다양한 자식 인스턴스를 참조할 수 있는 기능
- 부모는 자식을 품을 수 있다는 점
- 캐스팅
- 업캐스팅: 부모 타입으로 변경
- 위로만 타입을 변경하는 업캐스팅의 경우 부모, 자식의 인스턴스가 모두 생성되기 때문에 안전
- 캐스팅 생략 가능
- 다운캐스팅: 자식 타입으로 변경
- 인스턴스에 존재하지 않는 하위 타입으로 캐스팅하는 문제 발생 가능
- 업캐스팅: 부모 타입으로 변경
- 메서드 오버라이딩: 기존 기능을 하위 타입에서 새로운 기능으로 정의
- 추상 클래스
- 부모 클래스는 제공하나, 실제로 생성되면 안 되는 클래스
- 추상 메서드
- 자식 클래스가 반드시 오버라이딩 해야 하는 메서드를 부모 클래스에 정의 가능
- 이를 추상 메서드라고 함
- 추상 메서드가 하나라도 있는 클래스는 추상 클래스로 선언해야 함
- 모든 메서드가 추상 메서드인 경우, 이를 순수 추상 클래스라고 함
- 인터페이스
- 순수 추상 클래스를 구현하기 위한 기능
- 순수 추상 클래스 특징
- 인스턴스 생성 불가
- 상속시 모든 메서드 오버라이딩 필요
- 다형성을 위해 사용
- 인터페이스 특징
- 순수 추상 클래스 특징 포함
- 메서드는 모두 public, abstract
- 메서드 위 접근제어자 생략 권장
- 다중 구현 지원
- 인터페이스 사용 이유
- 인터페이스를 구현하는 곳에서 인터페이스의 메서드를 반드시 구현하라는 제약을 주는 것
- 순수 추상 클래스를 사용한다면 미래에 누군가 실행 가능한 메서드를 끼워넣을 수도 있음
- 클래스, 추상 클래스, 인터페이스는 프로그램 코드, 메모리 구조상 모두 똑같음
- 역할과 구현을 분리
- 자바 언어의 다형성을 활용
- 역할 = 인터페이스
- 구현 = 인터페이스를 구현한 클래스, 구현 객체
- 객체를 설계할 때 역할과 구현을 명확히 분리
- 객체 설계시 역할을 먼저 부여하고, 그 역할을 수행하는 객체 만들기
-다형성의 본질
- 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경 가능
- 다형성의 본질을 이해하기 위해서는 협력이라는 객체 사이의 관계에서 시작해야 함
- 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있음
- OCP
- Open for extension: 새로운 기능의 추가나 변경 사항이 생겼을 때, 기존 코드는 확장할 수 있어야 한단
- Closed for modification: 기존의 코드는 수정되지 않아야 한다
- 전략 패턴
- 가장 중요한 디자인 패턴중 하나
- 알고리즘을 클라이언트 코드 변경 없이 쉽게 교체 가능
- 팩토리 패턴 - PayMethodFactory
- 인자로 실제 결제 수단 구현체를 찾음
- 결제 수단을 찾지 못했을 때 null 대신에 항상 실패하는 결제 수단을 반환
- 자바 언어의 다형성을 활용