초기화와 생성자
생성자 (constructor)
- new 연산자를 통해서 인스턴스를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 특별한 메소드
- 멤버필드를 초기화하는 역할을 한다
- 생성자의 이름은 클래스 이름과 동일하게 작성한다
- 만약 사용자가 작성하지 않으면 자동으로 default constructor가 생성된다 : 매개변수의 종류나 개수를 다르게 오버로딩해서 생성자를 여러개 만들 수 있는데, 기본 생성자 외에 다른 생성자를 하나라도 만들게되면 자동으로 만든 기본 생성자를 없애므로 생성자를 여러버전 만들 때에는 기본 생성자도 추가해주어야 에러를 방지할 수 있다
- 생성자에는 static, final 등의 지정어를 사용하지 않는다
- 리턴하지 않기 때문에 리턴타입도 작성하지 않는다
- 생성자는 상속되지 않는다
- 생성자를 따로 지정하지 않으면 멤버변수의 값들을 객체 생성 후에 별도로 대입해주어야 하지만 생성자를 만들면 생성과 동시에 멤버변수의 값을 지정할 수 있어 편리하다
- 이클립스에서 생성자 자동으로 만드는 법 : 마우스 우클릭-소스-generate constructor
생성자 호출순서
- 서브 클래스(자식 클래스) 와 슈퍼 클래스(부모 클래스)의 생성자 호출 및 실행 순서 : 서브클래스의 객체 생성->서브 생성자 호출->슈퍼 생성자 호출->슈퍼 실행->서브 실행
서브클래스에서 슈퍼클래스의 생성자 선택하기
- super() 이용
- 원칙적으로 서브클래스의 각 생성자에 대해 함께 실행할 슈퍼클래스의 생성자를 지정해야 하는데, 서브클래스에서 생성자를 명시하지 않으면 컴파일러는 묵시적으로 슈퍼 클래스의 기본 생성자가 호출되도록 컴파일한다 -> 서브 클래스의 생성자가 기본 생성자이든 매개변수를 가진 것이든 !
- 서브클래스에서 슈퍼클래스의 생성자를 따로 지정하지 않은 경우에, 슈퍼에 기본생성자는 없이 매개변수 있는 생성자만 있다면 : 서브클래스의 기본 생성자에 대해 슈퍼의 짝 생성자를 못찾아서 오류
- super()와 인자를 이용하여 슈퍼클래스의 적당한 생성자를 호출, 반드시 서브클래스 생성자 코드의 제일 첫라인에 와야함
객체지향의 다형성 : 오버라이딩 / 오버로딩
오버라이딩 : 슈퍼클래스에서 상속받은 메소드를 서브 클래스마다 각자 다른 내용으로 구현하는 것
*조건 : 오버라이딩을 하기 위해서는 메소드의 이름 / 메소드의 매개변수의 숫자와 데이터 타입 그리고 순서 / 메소드의 리턴 타입 (통틀어서 메소드의 signature 라고 한다) 이 모두 같아야 한다
오버로딩 : 메소드의 이름은 같지만 인자의 형태, 수에 따라 optional하게 동작하도록 만든다 (이름이 같은 여러 개의 메소드를 허용함) (리턴타입은 구분기준이 아님! 인자로 구분함) -> 즉 오버로딩은 이름은 같지만 시그니처가 다른 메소드를 중복으로 선언할 수 있는 방법
*조건 : 매개변수의 숫자가 다르거나, 매개변수의 숫자는 같지만 데이터 타입이 다르거나 등등 매개변수의 형태나 수를 다르게 해서 오버로딩 해야함 ! 리턴타입은 구분기준이 아니므로 매개변수의 수와 형태는 모두 같은데 리턴타입을 다르게 하는 오버로딩은 불가능하다
바로 위 상위클래스에 접근하는 법 : super. => 이를 이용하여 오버라이딩 시 코드 반복을 줄인다
참조타입에 따른 차이
부모 클래스- 자식1클래스-자식2 클래스 순으로 상속이 이루어져 있다고 가정
부모 클래스 ; 메소드1
자식1 클래스 : 오버라이딩된 메소드 1-1, 메소드 2
자식2클래스 : 오버라이딩된 메소드1-2, 오버라이딩된 메소드 2-1, 메소드 3
을 멤버로 가지고 있다고 해보자
자식2 객체를 만드는데 이 객체의 참조타입을 자식 1로 지정했을 때, 메소드1을 호출한 결과는 ? 메소드 1-2 ! 자식1 타입으로 참조했다고 1-1이 나오지 않는다. 자식 1의 눈으로 자식 2라는 존재를 본다고 생각하면 쉬움
단 볼 수 있는 메소드의 종류는 참조타입의 눈을 따라간다 ! 즉 위의 상황에서는 메소드3이 보이지 않는다
'언어 공부 내용 정리 > Java' 카테고리의 다른 글
자바 예외처리 (0) | 2023.06.17 |
---|---|
자바 컴파일과 클래스, API (0) | 2023.06.17 |
자바 객체지향(1) (0) | 2023.06.09 |
자바 메소드 (0) | 2023.06.07 |
자바 문자열(String) 주요 메소드 (3) | 2023.06.02 |