9월 18일

Yullgiii·2023년 9월 18일
0
post-thumbnail

ADsP

오늘도 다시 시작되는 주간!!!!!!
모의고사를 풀어보아요!!!!!

내일 배움 캠프

지난주에 내일배움 캠프에서 제공되는 강의는 다 들어서
이번주중에 한번 다시 훑듯이 들어볼 예정이고
HTML을 당장 본캠프 들어가면 써야한데서 처음부터 복습을 하며
자바에 힘을 줘서 집중해보려한다!!!!

Java

지난주 얄코님의 강의를 이어서 들어볼예정이다
잘 모르는 계념이다보니 확실하게 알고 가는게 중요한 부분이라 조금 느리지만 확실하게!!!

상속

드라이브스루를 갖춘 얄코치킨의 클래스를 만든다면?
  • 기존 얄코치킨 클래스의 모든 필드와 메소드 포함
  • 드라이브스루 관련 필드와 메소드 추가
  • YalcoChicken 을 부모로 하는 자식 클래스 YalcoChickenDT 만들기
    • extends 연산자 사용(상속한다는 말을 가짐)
  • 디버그 모드로 dtStore1 인스턴스 살펴볼 것
    • 부모 클래스의 요소들 갖고 있음 확인 - 상속 inheritance
  • 부모 클래스의 protected 필드들을 private 으로 바꿔 볼 것
    • 💡 상속이 안 되는 것은 아님 - 자식클래스의 코드에서 사용하지 못할 뿐

메소드 오버라이딩

  • 부모가 가진 같은 이름의 메소드를 자식이 다르게 정의
    - ‘저는 제 방식대로 하겠습니다.’
public class ToggleButton extends Button {
    private boolean on;

    public ToggleButton(String print, boolean on) {
        super(print);
        this.on = on;
    }

    @Override
    public void func () {
        super.func(); // 💡 부모에서 정의한 메소드 호출
        this.on = !this.on;
        System.out.println(
                "대문자입력: " + (this.on ? "ON" : "OFF")
        );
    }
}

위의 내용이 잘 이해가 되지 않았다.

오버라이드 편의기능

  • 메뉴 - 코드 - 생성 - 메소드 재정의 선택 (생성자까지 진행)

super 부모의 생성자/메소드 호출

  • 부모 클래스에 생성자가 작성되었을 시
    • 자식 클래스에도 생성자 작성 필요
      • 생성자를 제거해 볼 것
    • super 를 사용해서 부모의 생성자를 먼저 호출
      • 이후 추가로 필요한 내용 작성
      • 즉 부모의 인스턴스부터 생성 후 이를 기반으로 자식 인스턴스 생성
      • 자식 클래스의 생성자는 super 로 시작해야 함
        • 순서 바꿔 볼 것
  • 부모의 기타 메소드를 자식 클래스에서 사용시 앞에 super. 를 붙임
    • super 는 부모 클래스의 인스턴스를 가리킴
      • this 가 해당 클래스의 인스턴스를 가리키듯…
    • 어떤 메소드에서든, 어떤 위치에서든 사용 가능

@Override 어노테이션

  • 어노테이션 : 이후 배울 것
  • 부모의 특정 메소드를 오버라이드함을 명시
    • 없어도 오류가 나지는 않음
    • 붙였는데 메소드명이 다를 시 오류 (실수 방지)

부모 클래스에 명시된 생성자가 없는 경우

  • 자식 클래스에서도 작성할 필요 없음

다형성


⭐️ 부모/자식 관계는 범주의 포함 관계로 이어짐

				//  💡 가능 - 자식 클래스는 부모 클래스에 속함
        Button button1 = new Button("Enter");
        Button button2 = new ShutDownButton();
        Button button3 = new ToggleButton("CapsLock", true);

        //  ⚠️ 불가
        ShutDownButton button4 = new Button("Enter");
        ToggleButton button5 = new ShutDownButton();
  • 자식 클래스의 인스턴스는 부모 클래스 자료형에 속함
    • 모든 셧다운버튼과 토글버튼은 버튼이다.
  • 다른 방향으로는 불가
    • 모든 버튼이 셧다운 버튼이거나 토글버튼인 것은 아니다.
    • 셧다운 버튼은 토글 버튼이 아니다.
				//  ⭐️ 편의 : 모두 Button이란 범주로 묶어 배열 등에서 사용 가능
        Button[] buttons = {
                new Button("Space"),
                new ToggleButton("NumLock", false),
                new ShutDownButton()
        };

        for (Button button : buttons) {
						//  ⭐️ 모든 Button들은 func 메소드를 가지므로
            button.func();
				}
  • ⭐️ 이처럼 특정 자료형의 자리에 여러 종류가 들어올 수 있는 것 - 다형성
    • 상속, 오버라이딩, 이후 배울 인터페이스 등을 통해 구현 가능

instanceof 연산자

  • 뒤에 오는 클래스의 자료형에 속하는(족보상 같거나 아래인) 인스턴스인지 확인
    • 이후 배울 인터페이스에 대해서도 사용 가능
  • 상속관계가 아닌 클래스끼리는 컴파일 오류
				Button button = new Button("버튼");
        ToggleButton toggleButton = new ToggleButton("토글", true);
        ShutDownButton shutDownButton = new ShutDownButton();

				//  true
        boolean typeCheck1 = button instanceof Button;
        boolean typeCheck2 = toggleButton instanceof Button;
        boolean typeCheck3 = shutDownButton instanceof Button;

        //  false
        boolean typeCheck4 = button instanceof ShutDownButton;
        boolean typeCheck5 = button instanceof ToggleButton;

        //  ⚠️ 컴파일 에러
        boolean typeCheck6 = toggleButton instanceof ShutDownButton;
        boolean typeCheck7 = shutDownButton instanceof ToggleButton;
        YalcoChicken ycStores[] = {
                new YalcoChicken(3, "판교"),
                new YalcoChicken(17, "강남"),
                new YalcoChickenDT(108, "철원"),

        };

        for (YalcoChicken store : ycStores) {
            if (store instanceof YalcoChickenDT) {
                //  ⭐️ 자식 클래스의 기능을 사용하려면 명시적 타입 변환
                ((YalcoChickenDT) store).takeDTOrder();
            } else {
                store.takeHallOrder();

명시적 타입 중요....벗 어렵...
Object 클래스 - 모든 클래스의 최고 조상🌟중요!!!!!!!(단군할아부지)

import Sec05.chap01.ex03.YalcoChicken;
import Sec05.chap05.ex02.Button;
import Sec05.chap05.ex02.ShutDownButton;
import Sec05.chap05.ex03.FireSlime;

public class Main {
    public static void main(String[] args) {
        Object obj1 = new Object();

        //  ⭐️ IDE의 안내대로 다른 패키지의 클래스 임포트
        //  💡 해당 클래스의 생성자가 public 이어야 함
        Object obj2 = new YalcoChicken(3, "판교");
        Object obj3 = new ShutDownButton();
        Object obj4 = new FireSlime();

        //  원시 자료형들도 Object의 인스턴스로... - 이후 자세히 배울 것
        Object obj5 = true;
        Object obj6 = 1;
        Object obj7 = "Hello";
        //  ⭐️ 모든 자료형을 포함할 수 있는 배열
        Object[] objs = {
                1, false, 3.45, '가', "안녕하세요", new Button("Space")
        };

        for (Object obj : objs) {
            System.out.println(obj);
        }

    }
}

이런식으로 작성을 해도는 되지만 유동성이 좋은 다른 언어들은 몰라도 Java는 이런식으로 하다간 알수없는 오류에 막혀서 암울해질수 있기에 하나하나 정확한 명시를 해주는것이 좋다.

클래스의 final


final 필드

  • 값 변경 불가
  • 필드 선언시 또는 생성자에서 초기화해야 함
    • 수정이 불가하므로…

final 메서드

  • 자식 클래스에서 오버라이드 불가

final 인스턴스

  • 다른 값을 넣는 것은 불가
  • 필드는 변경 가능
    • 주소는 바꾸지 못하지만 인테리어는 바꿀 수 있음

final 클래스

  • 하위 확장 불가 (자식 클래스를 만들 수 없음)

추상 클래스 (병상에 누운 부모)

  • 스스로는 인스턴스를 만들 수 없음
    • 그냥 ‘포유류’라고 불리는 동물은 없는 것처럼…
  • 자식 클래스로 파생되기 위한 클래스
    • 개, 고양이, 말 등의 클래스로서 인스턴스 생성 (구상 클래스)
    • 관련된 여러 클래스들의 공통분모를 정의하기 위한 클래스
public abstract class YalcoGroup {
    protected static final String CREED = "우리의 %s 얄팍하다";

    //  💡 클래스 메소드는 abstract 불가
    //  abstract static String getCreed ();

    protected final int no;
    protected final String name;

    public YalcoGroup(int no, String name) {
        this.no = no;
        this.name = name;
    }

    public String intro () {
        return "%d호 %s점입니다.".formatted(no, name);
    }
		//  이후 다른 패키지에서의 실습을 위해 public으로
    public abstract void takeOrder ();
}

abstract 클래스

  • 그 자체로 인스턴스 생성 불가
    • 얄코그룹에서 매장을 내지는 않음
  • 부모 클래스로서는 일반 클래스와 같음
    • 다형성 역시 구현됨
      • 얄코치킨과 얄코카페의 매장은 얄코그룹 소속

abstract 메소드

  • 추상 클래스에서만 사용 가능
  • 스스로는 선언만 하고 구현하지 않음
    • ⭐ 자식 클래스에서 반드시 구현
    • 구현하지 않을 시 컴파일 에러
      • 메뉴 - 코드 - 메서드 구현 / IDE의 오류 안내 클릭
    • 접근 제어자 의미 없음
  • 클래스 메소드는 추상 메소드로 작성할 수 없음
    • 인스턴스를 생성해서 쓰는 것이 아니므로 맞지 않음

인터페이스

추상 클래스와의 차이

🔴  : 추상 클래스 / 🔷  : 인터페이스
추상 클래스는 계열 같은것(족보)
인터페이스는 자격증같은것!!!!(아이템)

  • 🔴 포유류
    • 북극곰 - 🔷  사냥, 🔷  수영
    • 날다람쥐 - 🔷  비행
  • 🔴 파충류
    • 거북 - 🔷  수영
    • 날도마뱀 - 🔷  사냥, 🔷  수영, 🔷  비행
  • 🔴 조류
    • 독수리 - 🔷  사냥, 🔷  비행
    • 펭귄 - 🔷  사냥, 🔷  수영
추상 클래스인터페이스
기본 개념물려 받는 것 (혈통/가문/계열)장착하는 것 (학위/자격증)
다중 적용불가 (모회사는 하나 뿐)가능 (학위는 여럿 딸 수 있음)
상속관계에 의한 제한있음없음
생성자가짐가지지 않음
메소드구상, 추상 모두 가능추상 메소드 (abstract 안 붙여도 됨), default 구상 메소드, 클래스 메소드
필드모두 가능상수만 가능 (final 명시 불필요)
적용 연산자extendsimplements


  • 인터페이스는 다수 적용할 수 있음 확인
  • 필드는 public static final
    • 명시할 필요 없음
    • 초기화 필수 (생성자가 없으므로)
  • 메소드는 public abstract
    • 명시할 필요 없음
    • 메소드는 적용 클래스에서 구현 필수
  • 인터페이스 적용 클래스 작성시 IDE 안내 이용
    • 메서드 구현

자바8에 추가된 기능들

  • 클래스 메소드
  • default 구상 메소드

💡 default 로 구상 메소드를 넣을 수 있도록 한 이유

  • 사용되던 인터페이스에 새로운 기능을 추가해야 한다면?
    • 새로운 자바 버전의 라이브러리 인터페이스에 새 기능이 추가되어야 한다면?
    • 이를 적용하여 사용하던 클래스가 매우 많을 경우…
  • 해당 인터페이스의 하위 클래스들을 일일이 수정하지 않아도 되도록
    • 하위호환성

싱글턴 (자바만의 것이 아닌 객체지향방식)

  • 프로그램 상에서 특정 인스턴스가 딱 하나만 있어야 할 때
    • 🏪 본사직영매장 하나만 운영하는 회사
    • 프로그램상 여러 곳에서 공유되는 설정
    • 멀티쓰레딩 환경에서 공유되는 리소스
    • 기타 전역으로 공유되는 인스턴스가 필요한 경우


이런식으로 실행을 하면 각자의 값을 공유하지 않고 나온다.
그래서 공유하게 하려면 Tab 클래스와 Main 클래스에 변화를 주어서
밑의 사진처럼 하나하나 대입할수있게 바꾸어준다.

이러한 방법은 번거로움이 있고 협업자간의 공유가 되어있지 않으면 큰일.....
이젠 싱글턴을 이용하여 변화시켜 보자

굉장히 많이 쓰이는 패턴이고 유용한 패턴이다.

회고

어렵고 복잡하다.
그래서 다시금 기본이 중요함을 느낀다.
여러 문장들 문법들 그런것들이 많이 부족한다고 느껴진다.
다시금 열심히 해야겠다고 다짐한다.

HTML

자바에 집중을하다보니 머리가 깨질듯하여 HTML로 도망을 와서 강의를 다시금 들으며 복습한다.


회고

완전 기초적인 헤드들의 내용을 알아볼겸 오늘의 HTML을 했다!!!!!!!!!!!!!!
와 뭔가....힐링되는 느낌....
직관적으로 내가 뭘 바꿔야하는지가 보이니 참...좋으다....

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글