Skip to the content.

- 학습 목표 달성 확인 목록

- [] 다형적 변수를 활용할 수 있는가?

다형적 변수의 쉬운 예를 들자면

인간은 유인원의 특징을 상속받아왔다

하지만 그렇다고해서 유인원을 인간이라고 부를수 없다

이유는 사람의 모든 특징을 유인원이 가지고있지 않기 때문이다!

%[https://gist.github.com/osk2090/83ac7eae6392fdac002c551b629738b2]

- [] 컴파일러에서 다형적 변수의 사용 범위를 어디까지 허용하는지 아는가?

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
    }
}