Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240627 3주차 마무리 ② 본문

개발Article

[TIL]20240627 3주차 마무리 ②

최밤빵 2024. 6. 28. 00:57

4주차까지 다 들었는데..... 3주차 나름 열심히 정리했다고 했는데.. 아직도 모르는거 투성이일까 🥺

4주차는 알듯말듯 내일 부터 주특기주차 시작인데 준비가 안된거같아서 찜찜하다. 

뭔가 강의들으면서 좌절만 하는중이라 하려고했던 일들을 놓치는 느낌이라 답답하다!!!!!!!!!!!

 

3주차 마지막 정리! (일줄 알았는데....)

 

▶ 참조변수 super 

super은 자식 클래스에서 부모 클래스로 부터 상속받은 멤버를 참조하는데 사용되는 참조변수. 

멤버변수와 지역변수의 이름이 같을 때 this를 붙여서 구분했듯이 상속받은 멤버와 자신의 멤버의 이름이 같을 때는 super을 붙여서 구별 한다. 

모든 인스턴스 메서드에는 this와 super가 지역변수로 존재하는데, 자신이 속한 인스턴스의 주소가 자동으로 저장된다.부모의 멤버와 자신의 멤버를 구별하는데 사용된다는 점만 제외하면 this와 super는 근본적으로 같다. 

 

▶ super() - 부모의 생성자 

this() 처럼 super()도 생성자. 

this()는 같은 클래스의 다른 생성자를 호출하는데 사용되지만, super()는 부모의 생성자를 호출하는데 사용! 

Point3D(int x, int y, int z) {
    super( x, y ); // 조상클래스의 생성자 Point(int x, int y)를 호출 
    this.z =z; // 자신의 멤버를 초기화 
}

→ 생성자 호출은 반드시 첫 줄에!

→ 그렇지않으면 컴파일러가 생성자의 첫 줄에 super(); 를 삽입. 

 

클래스 자신에 선언된 변수는 자신의 생성자가 초기화를 책임지도록 작성하는 것이 좋다. 

기억하기! 생성자는 상속되지 않는다. 

 

▶ 접근제어자

클래스나 멤버, 주로 멤버에 접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위함이다.데이터가 유효한 값을 유지하도록, 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록 하기위해서는 외부로부터의 접근을 제한하는 것이 필요하다. 또 다른 이유는 클래스 내에서만 사용되는, 내부 작업을 위해 임시로 사용되는 멤버변수나 부분작업을 처리하기 위한 메서드 등의 멤버들을 클래스 내부에 감추기 위해서이다. 외부에서 접근할 필요가 없는 멤버들을 private으로 지정하여 외부에 노출시키지 않음으로써 복잡성을 줄일 수 있다. ← 객체지향개념의 캡슐화에 해당하는 내용.

public class Time {
    private int hour;
    private int minute;
    private int second;
    
    public int getHour() {
        return hour;
    }
    public void setHour(int hour) {
        if (hour < 0 || hour > 23)
            return;
        this.hour = hour;
        }
        public int getMinute() {
        return minute;
        }
        public int setMinute(int minute) {
        if (minute < 0 || minute > 59)
            return;
        this.minute = minute;
        }
        public int getSecond() {
        return second;
        }
        public void setSecond(int second) {
        if (second < 0 || second > 59)
            return;
        this.second = second;
    }
}

→  접근제어자를 private으로 해서 외부에서 직접 접근하지 못하도록 한다. 

만약 상속을 통해 확장 될 것이 예상되는 클래스라면 멤버에 접근 제한을 주면서도 자식 클래스에서 접근하는 것이 가능하도록 하기위해 private 대신 protected를 사용한다. private이 붙은 멤버는 자손클래스에서도 접근이 불가능 하기 때문이다. 

▷ 접근 제어자를 사용하는 이유?

- 외부로부터 데이터를 보호하기위해 

- 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위함 

 

▶ getter & setter 

get으로 시작하는 메서드는 멤버변수의 값을 반환하는 일을 하고, set으로 시작하는 메서드는 매개변수에 지정된 값을 검사하여 조건에 맞는 값일 때만 멤버변수의 값을 변경하도록 작성한다. 보통 멤버변수의 값을 읽는 메서드의 이름을 'get멤버변수이름' 으로 하고, 멤버변수의 값을 변경하는 메서드의 이름을 'set멤버변수이름'으로 한다. get으로 시작하는 메서드를 getter, set으로 시작하는 메서드를 setter이라고 한다. 

 

▶ 다형성 

부모 타입 참조변수로 자손 타입 객체를 다루는 것. 

구체적으로 부모클래스 타입의 참조변수로 자식 클래스의 인스턴스를 참조할 수 있도록 한 것.

Tv t = new Tv();
SmartTv s = new SmartTv();

→ 보통은 인스턴스의 타입과 참조변수의 타입이 일치하는 것이 보통.

Tv t =  new SmartTv();

→ 서로 상속관계가 있을 경우 부모클래스 타입의 참조변수로 자식 클래스의 인스턴스를 참조하는게

가능하다.

▷ 부모 타입의 참조변수로 자식 타입의 인스턴스를 참조할 수 있다.

반대로 자식 타입의 참조변수로 부모 타입의 인스턴스를 참조할 수는 없다. 

 

▶ 참조 변수의 형변환 

기본형 변수처럼 형변환이 가능하지만, 서로 상속관계에 있는 클래스 사이에서만 가능하기 때문에 자식 타입의 참조변수를 부모 타입의 참조변수로, 부모 타입의 참조변수를 자식타입의 참조변수로의 형변환만 가능하다.  →Object클래스 타입으로 형변환이 가능! 

 

참조변수의 형변환은 사용할 수 있는 멤버 개수를 조절하기 위한 것이다.

부모 타입으로 형변환은 생략할 수 있다. 이유는 다룰 수 있는 멤버의 개수가 줄어들기 때문에 안전하기 때문. 

반대로 실제 객체가 가진 기능보다 개수가 더 많으면 안된다.

▷ 서로 상속관계에 있는 타입간의 형변환은 자유롭게 수행될 수 있지만, 참조 변수가 가리키는 인스턴스의 자식 타입으로 형변환은 허용 X . 그래서 참조 변수가 가리키는 인스턴스의 타입이 무엇인지 먼저 확인하는 것이 중요! 

 

▶ instanceof 연산자

형변환 가능 여부를 확인하기 위한 연산자. 주로 조건문에 사용되고, instanceof 연산자의 왼쪽에는 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치한다. 연산의 결과로 boolean 값인 true or false 중 하나를 반환한다. instanceof를 이용한 연산결과로 true를 얻었다는 건 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 뜻한다. 부모 타입의 참조변수로 자식 타입의 인스턴스를 참조할 수 있기 때문에, 참조변수의 타입과 인스턴스 변수의 타입이 항상 일치하지는 않는다는걸 알게되었다. 부모 타입의 참조변수로는 실제 인스턴스의 멤버들을 모두 사용할 수 없기 때문에 실제 인스턴스와 같은 타입의 참조변수로 형변환을 해야만 인스턴스의 모든 멤버들을 사용할 수 있다. 

 

▶ 추상클래스 (abstract class)

클래스를 설계도에 비유하면, 추상 클래스는 미완성 설계도에 비유할 수 있다. 멤버의 개수에 관계된 것이 아니라 미완성 메서드(추상 메서드)를 포함하고 있다는 의미. 미완성 설계도로 제품을 만들 수 없듯이 추상 클래스로 인스턴스는 생성할 수 없다. 추상 클래스는 상속을 통해서 자식클래스에 의해서만 완성 될 수 있다. 여러개의 자식 클래스들에서 공통적인 필드나 메서드를 추출해서 만들 수 있다. 

추상 클래스 자체로는 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는데 있어 바탕이되는 부모 클래스로서 중요한 의미를 갖는다. 서로 다른 세 개의 설계도를 따로 그리는 것보다는 이들의 공통부분만을 그린 미완성 설계도를 만들어놓고, 이 미완성 설계도를 이용해서 각각의 설계도를 완성하는 것이 훨씬 효율적이다. 

 

추상클래스는 키워드 'abstract' 를 붙이기만하면 된다. 이 클래스를 사용할 때, 클래스 선언부의 abstract를 보고 이 클래스에는 추상메서드가 있으니 상속을 통해서 구현해주어야 한다는 것을 쉽게 알 수 있다. 추상메서드를 완성해야 인스턴스 생성이 가능하기 때문. 추상 클래스는 추상 메서드를 포함하고 있다는 것을 제외하고는 일반 클래스와 전혀 다르지 않다. 추상 클래스에도 생성자가 있으며, 멤버변수와 메서드도 가질 수 있다.

 

▶ 추상 메서드 (abstract method)

메서드는 선언부와 구현부로 구성되어 있다. 선언부만 작성하고 구현부는  작성하지 않은 채로 남겨 둔 것이 추상메서드. 설계만 해 놓고 실제 수행될 내용은 작성하지 않았기 때문에 미완성 메서드인 것. 메서드를 이와 같이 미완성 상태로 남겨 놓는 이유는 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 부모 클래스에서는 선언부만을 작성하고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려 주고, 실제 내용은 상속받는 클래스에서 구현하도록 비워 두는 것. 그래서 추상클래스를 상속받는 자식 클래스는 조상의 추상 메서드를 상황에 맞게 적절히 구현해주어야 한다. 

abstract 리턴타입 메서드이름(); // 주석을 통해 어떤 긴으을 수행할 목적으로 작성하였는지 설명한다. 

추상클래스로부터 상속받는 자식 클래스는 오버라이디을 통해 부모인 추상 클래스의 추상 메서드를 모두 구현해주어야 한다. 만일 부모로부터 상속받은 추상 메서드 중 하나라도 구현하지 않는다면, 자식 클래스 역시 추상 클래스로 지정해주어야 한다. 

 

▶ 추상클래스의 작성 

여러 클래스에 공통적으로 사용될 수 있는 클래스를 바로 작성하기도 하고, 기존의 클래스의 공통적인 부분을 뽑아서 추상클래스로 만들어 상속하도록 하는 경우도 있다. 상속이 자식 클래스를 만드는데 부모 클래스를 사용하는 거라면, 이와 반대로 추상화는 기존의 클래스의 공통부분을 뽑아내서 부모 클래스를 만드는 거라고 할 수 있다. 

 

▶ 추상화 ↔ 구체화 

반대되는 의미로 이해하면 쉽게 이해할 수 있었다. 상속계층에 따라 내려갈수록 클래스는 점점 기능이 추가되서 구체화의 정도가 심해지고, 따라 올라갈수록 클래스는 추상화의 정도가 심해진다. 따라 내려갈수록 세분화되고, 올라갈수록 공통요소만 남게되는 것! 

GregorianCalendar gc = new GregorianCalendar(); // 구체적
Calendar c = Calendar.getInstance(); // 추상적 

구체적 코드는 어떤클래스 객체를 만들건지 써있다. 참조변수도 일치. 모든게 분명하고 명확!

추상화된 코드는 뭘 반환할지 불분명하다.

추상화 된 코드는 구체화 된 코드보다 유연하다. 변경에 유리. 

 

▶ 인터페이스는 예제도 따라해보면서 내용이 많아질 것 같아서 내일 따로 정리할 예정! 

 

 

🥺오늘의 회고 

4주차를 듣는데 시간이 길지않아서 부담은 적은데.. 자꾸 헷갈리는 내용이라 어렵다....ㅠㅠ 요즘 가장 많이 하는 말이 어렵다라서 다 어려운건가?! 하고싶은데 아니야.. 자바는 어려운거다. 제일 잘 할수있는게 최대한 오래 앉아서 보는거라 하고는있는데 이게 맞나싶다 ㅠㅠㅠ 그래도.. 다시!!! 4주차 보러갑니다 ㅠ,, 

 

 

'개발Article' 카테고리의 다른 글

[TIL]20240629 JAVA 4주차  (0) 2024.06.30
[TIL]20240628 인터페이스  (0) 2024.06.29
[TIL]20240626 3주차 마무리 ①  (0) 2024.06.27
[TIL]20240625 3주차부터 천천히...!!  (0) 2024.06.26
[TIL]20240624 JAVA3주차 다시 시작!  (0) 2024.06.25