클래스
클래스의 구성요소
객체
- 클래스의 구성요소들을 실제 사용가능한 상태로 만든 것
- 메모리의 힙영역에 생성
- 참조값이라고 하는 고유한 주소값을 갖고 있음
- 객체의 참조값은 참조변수에 저장됨
참조변수
- 객체의 참조값을 저장하는 변수
- 객체 생성에 사용된 클래스가 참조변수의 타입이 됨
Person person = new Person();
- Person은 참조변수의 타입이다
- person은 참조변수이다
- 객체의 멤버변수, 멤버메서드의 사용은 항상 참조변수를 통해서만 가능
PersonService service = new PersonService();
service.printAllPerson();
- 참조변수의 값이 null이면 그 참조변수는 객체를 참조하고 있는 상태가 아니다
- 참조변수로 객체의 멤버변수, 멤버메서드를 사용하면 NullPointerException 오류 발생
멤버변수
- 객체의 속성(정보,값,데이터)를 저장하는 변수
- 객체가 생성 될 때 변수의 타입에 맞는 저장소가 생성되고 저장소에는 해당 타입의 기본값이 저장되어있음
- 객체가 유지되는 동안 멤버변수에 저장된 값도 계속 유지
멤버메서드
- 객체의 고유한 기능 담당
- 멤버메서드는 객체내의 모든 멤버변수를 사용 가능하며 객체 내의 다른 멤버메서드도 실행 가능
- 중복정의 가능
- 생성자 메서드는 멤버메서드가 아니다
생성자메서드
- 클래스 이름과 같은 이름을 가진 메서드
- 반환타입에 대한 정의가 없다
- new 연산자와 같이 사용되며 다른 방법으로는 호출 불가
- 객체가 생성되면 new 연산자와 같이 사용된 생성자 메서드가 자동 실행됨
- 생성자 메서드가 중복정의 되어 있다는것은 객체 생성 후 다양한 방법으로 객체를 초기화 할 수 있다는 뜻
메서드 중복정의(method overloading)
- 하나의 클래스 안에서 같은 이름의 메서드를 여러개 정의하는 것
- 중복정의하기 위해서는 매개변수의 개수, 타입, 타입별 순서가 달라야함
- 접근제한자, 반환타입은 같거나 달라도 상관 없음
- 기능은 비슷하나 메서드를 실행 시 필요한 값의 타입이나 갯수가 다를 경우 중복정의 가능
상속
- 부모클래스의 속성과 기능을 물려 받는 것
- 부모클래스의 속성과 기능 중 접근제한자가 private인 것과 생성자는 자식클래스로 상속 불가
- 상속을 해야 할 때
- 여러 하위 클래스에 동일한 속성과 기능이 반복될 때
- 부모 클래스의 속성과 기능을 물려받아 빠르게 자식 클래스를 구현해야 할 때
- 여러 관련있는 클래스들을 같은 종류로 만들어야 할 때
메서드 재정의
- 부모로부터 물려받은 메서드를 자식 클래스에서 다시 정의하는 것
- 접근제한자, 반환타입, 메서드명, 매개변수의 타입 및 개수가 전부 동일해야함
- 메서드를 재정의 하는 이유
부모로부터 물려받은 기능이 자식 클래스에서 사용하기 적합치 않을 때
부모클래스와 같은 사용법으로 기능을 구현해야 할 때
클래스 형변환
- 자식클래스 타입의 객체를 부모클래스 타입의 참조변수가 참조 하는 것
- 자식클래스 타입의 참조변수는 절대 부모클래스타입의 객체를 참조 할 수 없다.
- Object타입의 참조변수는 모든 객체를 참조할 수 있다
- 클래스형변환이 발생하면 부모타입의 참조변수에 저장된 값은 자식클래스 타입의 참조값이 아닌, 참조변수 타입과 일치하는 객체의 주소값이다
Phone p = new Iphone();
- 참조변수 p에 저장된 참조값은 Iphone 객체의 참조값이 아니라, Iphone객체 생성 시 같이 생성된 Phone 객체의 참조값이다
- 참조변수 p는 Phone객체의 공개된 속성과 기능 사용 가능
- 참조변수 p는 묵시적 형변환을 통해 Iphone객체의 속성과 기능 사용 가능
- 단, Phone객체와 Iphone객체에 메서드 재정의 관계에 있는 메서드가 있으면, Iphone객체의 메서드가 실행된다
다형성
- 메서드 중복정의의 다형성
하나의 객체 안에 메서드가 중복정의 되어있으면, 매개변수에 따라 적절한 메서드가 자동으로 선택되어 실행됨
- 메서드 재정의의 다형성
부모클래스 타입의 참조변수가 자식클래스 타입의 객체를 참조하고 있고, 메서드 재정의 관계에 있을 때
재정의 메서드를 실행하면 자식객체의 재정의된 메서드가 실행됨