☕️ Java 문법 종합반 (2) - ② 객체지향 / TIL - day 13

하리비·2025년 3월 10일
2

☕️ Java

목록 보기
6/8
post-thumbnail

객체지향의 4가지 특징을 정리했다 ! - 개인적으로 기초 개념정리를 더했다,,,


⬛️ < 객체지향 PART ❶ - 캡슐화 >


📖 캡슐화

  • 객체의 정보를 외부에서 직접 접근하지 못하게 한다

  • 접근제어자로 구현할 수 있다


📖 접근제어자

  • 접근제어자클래스 내부패키지 내부상속한 클래스전체 공개
    public
    protected
    default
    private

📌 접근제어자 활용 예시

  • 1. 생성자 호출

    잘못 사용한 예시올바르게 사용한 예시
    ❌ 오류 발생문제없음 😁
    private 같은 클래스 내부에서만 사용가능하기 때문public = 전체공개이기 때문에
  • 2. 인스턴스 변수

    ✔️클래스✔️메인
  • 3. 인스턴스 메서드 접근

    ✔️클래스✔️메인

💡 Tip
속성은 private로 사용하고, 한단계씩 풀어가자
생성자는 public으로 열어두면 매개변수를 활용해 객체를 생성하고 나면
속성은 변경이 안된다는 것 ~!~! 기억하자


📖 데이터 접근 - getter, setter

  • 캡슐화 때문에 데이터를 찾거나 접근이 곤란할 때 사용한다
  • 당연 각 메서드를 만드는게 먼저임

📌getter : 데이터 찾을때

  • 예시 ) 걔 이름이 머였더라? 너무 코드가 길어서 찾을 수 없어🥲
    String name = person.getName();
     System.out.println("이름:"+name); // 출력에 person의 이름 나옴

📌setter : 캡슐화 된 데이터를 바꿀때

  • 예시 ) 데이터를 보호했지만 ! 이름을 private으로 보호해뒀지만 바꿀래😉
    person.setName("steve"); // 원래 이름 "surin"
    String name2 = person.getName();
    System.out.println("이름:"+name2); // "steve"로 출력됨
    

    💡 세터 활용의 예시 (핵시설의 관리자)

    • ❌ 무분별한 세터 사용
      • B를 입력하지 못하게 String storeprivate으로 보호 ➡︎ store를 사용할 수 없음
      • setter를 이용해 접근 가능하도록 함 ➡︎ 다시 "B"입력 가능해짐..🤔

    • ⭕️ 올바른 사용
      • 이 경우 "B"를 입력할 수 없도록, if문을 함께 사용한다
      • 이외에도 세터를 남발대신 private으로 묶인 것들을 모아서 별도의 기능으로 만들어 제공하기 등등,, 다양한 방법이 있다

⬛️ < 객체지향 PART ❷ - 상속 >


📖 상속(Inheritance)

  • 클래스간의 관계를 부모(상위) ,자식(하위) 관계로 바라본다
    (부모의 속성과 기능을 자식이 물려받는다)
  • 재사용성, 확장이 가능하다
  • extends 로 상속 관계 표현 가능

📌 장점 1️⃣ - 재사용성

  • 상속을 통해 부모 클래스의 인스턴스 멤버들에 접근할 수 있다
  • 모든 부모의 요소를 자식이 활용할 수 있다

💡 예시

  • 이렇게 child 에는 아무것도 작성하지 않았으나, parent 의 모든 요소를 물려받고 있다

✔️super - 부모 인스턴스 호출

  • 자식 클래스에서 명확하게 부모의 인스턴스를 호출하고 싶을 때
  • super로 구현
✔️자식클래스✔️메인클래스
부모클래스의 familyName = "스파르탄"임부모 클래스 무시, 자식 클래스에서 다시 할당한 값이 나온다
super를 통해 부모의 인스턴스를 호출한다부모 인스턴스가 명확하게 호출됨

✔️super() - 부모 인스턴스의 생성자

  • 부모의 생성자를 물려받았지만 추가적으로 자식 클래스에서 생성자를 입력하고 싶을 때 !
  • 무조건 super()를 위에 두고 아래에 생성자를 만든다
    (부모 생성자가 있어야 자식 생성자도 만들수 있음)

📌 장점2️⃣ - 확장

  • 부모 클래스의 기능 유지 + 자식 클래스에서 기능을 더 확장


📖 메서드 오버라이딩(overriding)

  • 부모 클래스의 메서드를 자식 클래스에서 변경하고 재정의
    • 메서드 이름, 매개변수, 반환타입이 일치해야한다
    • 접근제어자는 부모보다 강한 수준으로 변경가능
  • @Override 로 구현
✔️부모클래스의 메서드✔️자식클래스에서 재정의

📖 추상 클래스

  • 계층 구조를 활용해서 하위 클래스에 특정 메서드 구현을 강제하기 위해 사용한다

    • 1️⃣ abstract 로 클래스 선언

    • 2️⃣ abstract 로 메서드 자식에게 강제 구현시키기

      부모 클래스자식 클래스
      @Override를 쓰고 작성하기
  • 주의 ‼️ 추상클래스는 인스턴스화 할 수 없다!!!

추상클래스 vs 인터페이스 ? 🤔

  • 인터페이스 : 표준을 제공 / 인스턴스 변수 사용불가
  • 상속 : 계층적 구조 표현 / 속성이나 기능 재사용시 용이

⬛️ < 객체지향 PART ❸ - 추상화 >


📖 추상화

  • 불필요한 정보를 제거하고 본질적인 특징만 남기는 것
    (예를 들어, 고양이의 특성, 동물의 특성을 제외해주면 생명체라는 본질적 특성에 집중할 수 있다)
    ➡︎ 덕분에 유지보수성이 좋아진다

📌 인터페이스를 사용한 추상 계층 표현

  • 나는 막연히 클래스끼리만 상속할 수 있다고 생각했는데,, 왜그랬지
    인터페이스 > 인터페이스 > 클래스 이렇게도 상속이 된다

    이런식으로 ! 주석에 달아놓은 것들이 원래 해당 메서드가 선언된 클래스의 위치

📌 클래스를 사용한 추상 계층 표현

  • 동일하게 상속을 통해 계층을 표현할 수 있다
  • 추가로!! 메서드 오버라이딩을 통해 부모의 메서드를 재정의 할 수 있다

⬛️ < 객체지향 PART ❹ - 다형성 >


📖 다형성

  • 상위 타입을 통해 여러 객체를 다룰 수 있다
    (예시 - 동물을 통해 고양이 강아지를 다룬다) 약간 카테고리 느낌, 대분류 소분류 느낌
  • 상속 구조 : Lifeform > Animal > Cat,Dog

    ➡︎ 다형성을 활용해서 Cat, Dog를 Animal 자료형에 넣어줄 수 있다!

📖 형변환

📌 업캐스팅

  • 부모 타입으로 자식타입을 받을 수 있다 (스몰박스 > 큰 박스)

💡 주의사항

  • 자식 클래스의 고유 기능은 사용할 수 없다 ➡︎ 사용하려면 다운캐스팅

📌 다운캐스팅

  • 부모데이터 타입을 다시 자식 데이터 타입에 넣어준다
    (데이터 손실이 일어나기 때문에 자료형 명시해야함)

💡 주의사항

  • 자료형을 잘못써도 컴파일러가 감지하지 못하기 때문에 instanceof를 사용

📖 다형성 장점

  • 한가지 타입으로 여러 데이터타입을 다룰 수 있다


1개의 댓글

comment-user-thumbnail
2025년 3월 11일

지롱비 : 퍼가요 ~ ❤️

답글 달기