1. 자바에서 객체란 무엇인가?
- 클래스에 정의된 내용대로 new 연산자를 통해 메모리 영역에 생성된 것
2. 생성자란 무엇이며 왜 사용되는지(목적)와 작성 규칙은?
객체가 new 연산자를 통해 Heap 메모리 영역에 할당될 때
객체 안에서 만들어지는 필드 초기화 + 생성 시 필요한 기능 수행
반환값이 없으며 생성자명을 클래스명과 똑같이 지정해주어야 함
접근제한자 클래스명() {}
3.
public class Car(){
private String engine;
private int wheel;
}
3-1. 해당 클래스의 기본생성자와 매개변수 2개 짜리 생성자를 작성하시오.
public Car(){} // 기본생성자
public Car(String engine, int wheel){
this.engine = engine;
this.wheel = wheel;
}
3-2. 해당 클래스의 getter / setter 를 작성하시오.
public String getEngine(){
return engine;
}
public void setEngine(String engine){
this.engine = engine;
}
public int getWheel(){
return wheel;
}
public void setWheel(int wheel){
this.wheel = wheel;
}
4. Test[] arr = new Test[2];
arr[0] = new Test();
arr[1] = new Test();
해당 객체배열을 메모리 구조와 함께 설명하시오.
Test[] arr = new Test[2];
Stack 영역에 Test객체배열을 참조하는 참조변수 arr에 Test객체 2칸짜리 배열을 Heap 메모리 영역에 생성 후 생성된 객체의 주소값을 arr에 대입하겠다.
arr의 0번째 인덱스에 Test객체를 생성하여 생성된 주소값을 arr[0]에 대입하겠다.
5. super()란 무엇이며, 작성시 유의사항은 무엇인가?
super 생성자는 부모객체의 생성자를 호출하는 메소드로 기본적으로 자식 생성자에 부모생성자가 포함된다.
예)
public Student(){
super();
}
자식 클래스 생성자 안에 부모 생성자를 호출하는 super()는 반드시 첫 줄에만 작성해야 하며 미작성시 컴파일러가 컴파일 단계에서 자동으로 추가해준다.
6. 오버로딩의 정의와 성립조건은?
오버로딩은 한 클래스 내에서 같은 이름의 메소드를 여러 개 정의하는 것
- 같은 메소드 이름
- 매개변수 타입, 개수, 순서 중 하나라도 달라야함
7. 오버라이딩의 정의와 성립조건은?
오버라이딩은 자식 클래스가 상속받은 부모 메소드를 재작성하는것이다.
- 메소드 이름 동일
- 매개변수의 개수, 타입, 순서 동일
- 리턴타입동일
- private 메소드 오버라이딩 불가
+ 자식 메소드의 접근 범위가 부모 메소드의 접근 범위보다 넓거나 같아야함
+ 자식 메소드의 예외 수가 부모 메소드의 예외 수보다 적거나 범위가 좁아야 함
8. 다형성의 업캐스팅이란 무엇인가?
상속 관계에 있는 부모, 자식 클래스 간에 부모타입의 참조형 변수가 모든 자식 타입 객체의 주소를 참조할 수 있다.
다형성
객체지향 언어의 특징 중 하나로 '다양한 형태를 갖는다'라는 뜻으로 하나의 행동으로 여러가지 일을 수행하는 개념이다.
상속을 이용항 기술로 부모 클래스 타입 참조변수 하나로 상속관계에 있는 여러 타입의 자식 객체를 참조할 수 있는 기술
부모 클래스 PolyCar
자식 클래스 PolyTesla/ PolySpark
객체 만들기
1) PolyCar객체 생성
PolyCar car = new PolyCar();
부모타입 참조 변수 = 부모 객체 참조하겠다.
출력결과 : Car에 작성한 메소드 모두 사용 가능
2) Tasla 객체 생성
PolyTesla polyTesla= new PolyTesla();
자식타입 참조 변수 = 자신 객체
출력결과 : Car를 상속 받았으니 Car메소드 모두 사용 가능하고 자신의 메소드도 사용 가능하다.
3) 다형성(업캐스팅)
PolyCar polyTesla = new PolyTesla();
부모타입 참조변수 = 자식 객체
Tesla 객체를 참조하는 변수의 타입이 PolyCar (부모)이기 때문에 PolyTesla(자식) 객체를 참조 할 수 있음
출력결과 : 다형성 업캐스팅이 적용되어, PolyCar 에 메소드만 사용이 가능하다.
여기서 업캐스팅이란 ? 아래에서 더욱 자세히 알아보자!
많이 사용되는 것이도 자주 나오니 개념을 확실하게 이해하고 넘어가자!
1. 업캐스팅
상속 관계에 있는 부모, 자식 클래스 간에 부모타입의 참조형 변수가 모든 자식 타입 객체의 주소를 참조할 수 있음
자식객체 주소를 전달 받은 부모타입의 참조변수를 통해 접근할 수 있는 객체의 정보는 부모로부터 상속받은 멤버만 참조 가능
위 예제로 메모리 구조를 그려보자면 아래와 같이 확인할 수 있다.
현재, 참조변수가 Car타입이기 때문에 Tesla객체가 Car객체 부분만을 참조 할 수 있는 형태로 변한다.
즉 자신이 가지고 있는 것을 사용못하고, Car로 부터 상속 받은 내용만 사용 가능하다.
* 다형성을 이용한 객체배열
객체배열 : 같은 객체 참조 자료형의 변수를 하나의 묶음으로 다루는 것
+ 다형성 적용 -> 상속관계에 있는 하나의 부모 클래스 타입의 배열공간에 여러 종류의 자식 클래스 저장 가능
다형성(업캐스팅) : 부모타입참조 변수 arr[i]로 자식 객체를 참조할 수 있다.
PolyCar polycar = new PolyCar();
polycar.setEngine("일반엔진");
PolyCar polyspark = new PolySpark();
polyspark.setEngine("경차엔진");
PolyCar polyTesla = new PolyTesla();
polyTesla.setEngine("전기엔진");
PolyCar [] arr = new PolyCar[3];
arr[0] = polycar;
arr[1] = polyspark;
arr[2] = polyTesla;
for(int i =0;i<arr.length;i++) {
System.out.println(i+"번째 인덱스의 엔진 : "+arr[i].getEngine());
출력 결과 :
0번째 인덱스의 엔진 : 일반엔진
1번째 인덱스의 엔진 : 경차엔진
2번째 인덱스의 엔진 : 전기엔진
+ instanceof : 객체의 자료형을 검사하는 연산자로 참조하는 객체가 특정 자료형이거나 부모쪽 상속 관계인지 확인
클래스 타입이 맞으면 true, 맞지 않으면 false 반환
2. 다운캐스팅
자식 객체의 주소를 받은 부모참조형 변수를 가지고 자식의 멤버를 참조해야할 경우,
부모 클래스 타입의 참조형 변수를 자식 클래스 타입으로 형변환하는 것!
자동으로 되지 않기 때문에 반드시 자식 타입을 명시하여 형변환해야한다.
관련해서 아래 예시를 보면 Car c1 = new Tesla();
업캐스팅 된 상태에서 instanceof를 사용하여 어떤 객체에 참조가 되었는지 확인하는 예제를 만든 것이다.
// 업캐스팅 된 상태
Car c1 = new Tesla();
if(c1 instanceof Spark) {
Spark s1 = (Spark)c1; //다운 캐스팅
System.out.println("성공");
}else {
System.out.println("실패(Spark 타입이 아님)");
}
바인딩
- 실제 실행할 메소드 코드와 호출하는 코드를 연결 시키는 것이다.
PolyCar c1 = new PolyCar("경유엔진","경유",8);
System.out.println(c1.getEngine());
//바인딩 PolyCar 객체에 있는 getEngine() 메소드 호출 == 바인딩
1) 정적 바인딩
프로그램이 실행되기 전 컴파일 단계에서 메소드와 메소드 호출부를 연결
2) 동적바인딩
컴파일 시 정적 바인딩된 메소드를 실행할 당시의 객체 타입을 기준으로 바인딩 되는 것
장점 : 업캐스팅 상태의 참조변수를 별도 다운캐스팅 없이 자식의 오보라이딩 되 메소드를 수행 할 수 있다.
다형성 업캐스팅 적용
PolyCar c2 = new PolySpark("경차엔진","휘발유",4,0.5);
System.out.println(c2.toString());
//호출 : 경차엔진/휘발유/4/0.5
//PolyCar타입으로 toString()도 PolyCar의 toString()호출 -> 정적 바인딩
하지만, 실행해보면 자식 (PolySpark)의 toString이 호출 된다!
-> 컴파일 시에는 부모 (PolyCar)와 바인딩 == [정적 바인딩]
-> "실행 시" 에는 자식 (PolySpark)의 오버라이딩된 메소드와 바인딩 ==[동적바인딩]
'ON > JAVA' 카테고리의 다른 글
16일_ 컬랙션 List계열 및 향상된 for문 (0) | 2023.05.10 |
---|---|
15일차 _ 인터페이스 및 예외처리 (4) | 2023.05.09 |
13일차_객체지향_상속 (0) | 2023.05.03 |
12일차 객체지향에 대해서 복습 및 객체 실습 문제 (0) | 2023.05.02 |
11일차_객체지향 3번째 시간 (0) | 2023.05.01 |