Java (클래스 멤버와 인스턴스 멤버, 상속과 캡슐화, 다형성과 추상화)

주8·2023년 1월 9일
0

WIL

목록 보기
4/19
post-thumbnail

기간
2023/1/2 ~ 2023/1/6

수업
실시간 ZOOM 수업


Day 8(클래스 멤버와 인스턴스 멤버)

클래스 멤버와 인스턴스 멤버

static이 좀 헷갈렸다.
그래서 static을 언제 써야 하는거지? 무조건 static을 쓰면 되는 거 아닌가? 싶어서
하지만 예를들어 static변수는 인스턴스를 참조하지 않는만큼 인스턴스변수와는 다르게 한 곳에서 값을 바꾸면 해당 변수를 참조하고 있던 다른 곳의 값들도 바뀌기 때문에 공통으로 써야할 때(예를 들면 회사명이라던가) 사용해야 한다.
-> 애초에 인스턴스변수는 인스턴스를 참조하고 인스턴스는 new 연산자로 생성될 때마다 다른 인스턴스니까(참조값이 다름). 하지만 static은 객체가 아닌 클래스에 속하니까 값이 같을 수 밖에...

class A{
    int instanceVariable;
    static int staticVariable;

    void setInstanceVariable(int n){
        instanceVariable = n;
        System.out.println(instanceVariable);
    }

    static void setStaticVariable(int n){
        staticVariable = n;
        System.out.println(staticVariable);
    }
}

class B extends A{}

class C{
    public static void main(String[] args){
        A a = new A();
        System.out.println(a.instanceVariable); //0
        System.out.println(A.staticVariable ); //0
        a.setInstanceVariable(1); //1
        A.setStaticVariable(1); //1
        System.out.println("---------------");
        B b = new B();
        System.out.println(b.instanceVariable); //0 (A클래스에 대한 인스턴스여도 마찬가지)
        System.out.println(B.staticVariable); //1 (초기값이 아닌 위에서 setter로 변경한 값이 출력됨)
        b.setInstanceVariable(1); //1
        B.setStaticVariable(2); //2
    }
}

자바의 정석 남궁성 강사님께서는 아예 cv(클래스 변수)는 cm(클래스 메서드)에서만 사용하라고 못 박으셨다. 그래서 인스턴스 멤버(변수, 메서드)를 쓰지 않을 때 static을 붙이라고 하심.
하긴 static은 객체를 참조하지 않으니까 객체를 참조해야 하는 인스턴스멤버랑 혼용하면 쓰는 의미가 없겠지...


Day 9(상속과 캡슐화)

상속과 캡슐화

이제 슬슬 머리가 복잡해진다 ㅎㅎ...
상속은 들었을 땐 이해가 갔는데 막상 코딩을 하려고보니 이해가...ㅋ
특히 업캐스팅 다운캐스팅 나오면서 혼란스러워졌다.
(아니 그냥 각자 쓰지ㅠㅠ)

그래서 수업 들으면서 IDE로 클래스 만들어서 확인하고 sout 찍어보고 ㅎㅎ
결론적으로 다운캐스팅은 하위클래스와 동일해지는 거고(업캐스팅한 인스턴스를 다시 하위클래스 타입으로 변경해야 할 때 할 수 있고, 상위클래스를 바로 하위클래스 타입으로 변환하는 건 안 됨)
다만 업캐스팅의 경우 오버라이딩된 하위클래스 메서드로 접근이 가능해진 상위클래스라고 이해했다.

근데 또 업캐스팅, 다운캐스팅 인스턴스화하는 것도 헷갈림ㅋㅋ
다운캐스팅은 꼭 업캐스팅을 해주고 해야 하잖아ㅠㅠ 왜 super class에서 sub class로 변환이 바로 안 되는 거냐고...

포함이랑 상속의 경우는 예를들면 회원정보에서 주소만 따로 빼서 관리할 때, 회원 A는 주소를 하나만 가질 수도 있지만 회원 B는 주소를 2개 이상 가질 수도 있으니까 회원정보에 포함하면 주소를 array로 받을 수 있고(1:n <-> n:1관계) 그렇게 되면 회원정보에서 주소를 추가하고자 할 때 변경하지 않은 다른 정보들도 추가로 인스턴스에 값을 넣을 필요가 없어지니까 효율적이다.

반면 상속은 하위클래스가 상위클래스의 attribute, 메서드를 가져오는 개념으로, 하위클래스에서 통합으로 관리해야 할 때, 공통으로 관리하는 속성이 여러 클래스에 있다면 상위클래스에 해당 속성을 넣고 상속하는 개념으로 이해했다.
예컨대, 기존 회원정보가 있고 추가로 관리자에 대한 회원정보를 만든다고 하면, 관리자는 기존 회원정보와 공통된 속성이 있고 거기에 추가적으로 사업자 주소라든가, 권한 같은 게 필요한데 이때 굳이 회원정보를 포함으로 가지고 있기보다(기존 정보 따로, 추가적인 관리자 정보 따로 관리할 필요가 없다면) 상속받아서 하나의 객체에서 관리하고자 한다면 상속을 쓰면 된다고 이해했다.


Day 10(다형성과 추상화)

다형성과 추상화

다형성은 상위클래스 타입으로 하위 객체를 받을 수 있다는 것.

static void buy(Product p){
	...
}

public static void main(String[] args){
	Product p1 = new Tv();
    Product p2 = new Computer();
    Product p3 = new Audio();
    
    buy(p1);
    buy(p2);
    buy(p3);
}

Product를 상속하고 있는 Tv, Computer, Audio를 parameter로 받을 수 있는 것이다.
상위클래스를 매개변수로 받으면 굳이 하위클래스 하나하나를 매개변수로 오버로딩할 필요 없이 메서드 하나로 끝낼 수 있다.

그리고 추상클래스는 인터페이스처럼 선언부만 있는 (구현하지 않은) 메서드를 하위클래스에서 상속받아서 구현하는 건데... 그때 구현하지 않은(선언부만 있는) 메서드는 앞에 abstract를 붙이고, 그런 추상 메서드가 1개라도 있으면 그 클래스는 abstract 클래스...

근데 추상클래스... 인터페이스랑 뭐가 다른 거지......
이전에는 인터페이스에 구현된 메서드는 쓸 수 없었지만 이젠 쓸 수 있잖아...
다음시간에 배우겠지만...

profile
웹퍼블리셔의 백엔드 개발자 도전기

0개의 댓글