티스토리 뷰
- 학습 목표 달성 확인 목록
- [] 다형적 변수를 활용할 수 있는가?
다형적 변수의 쉬운 예를 들자면
인간은 유인원의 특징을 상속받아왔다
하지만 그렇다고해서 유인원을 인간이라고 부를수 없다
이유는 사람의 모든 특징을 유인원이 가지고있지 않기 때문이다!
- [] 컴파일러에서 다형적 변수의 사용 범위를 어디까지 허용하는지 아는가?
Vehicle v1 = new Sedan();
// model과 capacity 변수는 원래 Vehicle 설계도에 있는 변수이기 때문에
// 당연히 레퍼런스를 통해 사용할 수 있다.
v1.model = "티코";
v1.capacity = 5;
// 자바 컴파일러는 레퍼런스의 클래스를 보고 사용할 수 있는 변수/메서드 인지 아닌지
// 판단한다. 비록 v1 변수에 Sedan 객체의 주소가 들어 있다 할지라도,
// 실제 들어 있는 객체의 주소로 판단하지 않고 레퍼런스가 어떤 클래스냐에 따라 판단한다.
//
// v1.cc = 1980; // 컴파일 오류!
// v1.valve = 16; // 컴파일 오류!
// v1.sunroof = true; // 컴파일 오류!
// v1.auto = true; // 컴파일 오류!
// 그럼에도 불구하고 레퍼런스가 실제 가리키는 객체의 모든 메모리에 접근하고 싶은가?
// => 형변환 하라!
((Sedan)v1).cc = 1980;
((Sedan)v1).valve = 16;
((Sedan)v1).sunroof = true;
((Sedan)v1).auto = true;
System.out.printf("%s, %d, %d, %d, %b, %b\n",
v1.model, v1.capacity,
((Sedan)v1).cc, ((Sedan)v1).valve,
((Sedan)v1).sunroof, ((Sedan)v1).auto);
// 각각의 변수에 대해 일일이 형변환해서 사용하기가 불편한가?
// => 그냥 레퍼런스를 형변환 해서 사용하라!
Sedan s = (Sedan)v1;
s.cc = 1980;
s.valve = 16;
s.sunroof = true;
s.auto = true;
System.out.printf("%s, %d, %d, %d, %b, %b\n",
s.model, s.capacity,
s.cc, s.valve,
s.sunroof, s.auto);
- [] JVM에서 다형적 변수의 사용 범위를 어디까지 허용하는지 아는가?
첫번째 질문의 예제를 보면
Car c = new Sedan();
c.sunroof = true;//오류
c.auto = true;//오류
여기서 오류가 나는 이유는 Car 클래스는 Sedan클래스의 상위 클래스이다
고로 Sedan의 인스턴스 멤버를 접근할 수 없다.그래서 형변환을 하여 접근한다
Car c = new Sedan();
Sedan s1 = (Sedan) c;
s1.sunroof = true;
s1.auto = true;
- [] 레퍼런스를 타입 캐스팅하는 방법을 아는가?
상위 질문 참조!
- [] final 제한자의 사용법을 아는가?
멤버변수에 붙으면 변할수 없는 상수로 변하며
메소드는 오버라이드를 할수 없는 상태
클래스는 상속을 허용하지 않는 클래스가 된다.
- [] 스택과 큐의 구동 원리는 이해하는가?

스택은 쌓는다는 뜻으로 마지막으로 들어가고 그 마지막이 먼저 나온다는 약자로 LIFO(리포)라고 부른다
큐는 열로 쌓이는 구조이며 먼저들어가고 그 먼저 들어간 데이터가 먼저 나온다는 약자로 FIFO(피포)라고 부른다.
- [] 스택과 큐를 언제 적용해야 하는지 예를 들어 설명할 수 있는가?
스택은 인터넷브라우저를 사용하다가 뒤로가기를 누르면 그 뒤페이지로 돌아가는 시스템인 breadcrumb를 구현한것이고(차곡차곡 쌓인다)
큐는 예약처리,자판기,선착순 시스템을 떠올리면 된다.
- [] 스택을 구현할 수 있는가?
public class Stack생성 {
static class Stack {
private int top;
private int stackSize;
private int stackArr[];
public Stack(int stackSize) {
top = -1;
stackArr = new int[stackSize];
this.stackSize = stackSize;
}
public void push(int data) {
stackArr[++top] = data;
}
public int pop() {
if (top == -1) {
throw new ArrayIndexOutOfBoundsException();
}
return stackArr[top--];
}
public int peek() {
if (top == -1) {
throw new ArrayIndexOutOfBoundsException();
}
return stackArr[top];
}
public void printStack() {
System.out.println("stack list");
for (int i = top; i >= 0; --i) {
System.out.println(stackArr[i]);
}
}
}
public static void main(String[] args) {
Stack st = new Stack(100);
st.push(1);//맨 밑에 깔림
st.push(2);
st.push(3);
st.push(4);
st.push(5);//맨 위에 쌓임
st.printStack();//5 4 3 2 1
System.out.println("peek: " + st.peek());//peek:5
st.pop();
st.printStack();//4 3 2 1
st.pop();
st.pop();
st.pop();
st.pop();
st.printStack();//null
}
}
'Academy' 카테고리의 다른 글
| [210209]Iterator/추상클래스/인터페이스 (0) | 2021.02.11 |
|---|---|
| [210208]접근제어자/오버라이딩 (0) | 2021.02.09 |
| [210204]상속/추상 (0) | 2021.02.04 |
| [210203]캡슐화-다형성 (0) | 2021.02.04 |
| [210202]캡슐화 (0) | 2021.02.04 |
