13Days) 객체지향 프로그래밍 심화(1) - 상속과 캡슐화

nacSeo (낙서)·2022년 11월 7일
0
post-thumbnail

◉ 학습목표

1. 상속에 관하여 이해하고 활용할 수 있다.
2. 캡슐화에 관하여 이해하고 활용할 수 있다.
  1. 상속

⦿ 학습내용

☞ 상속

✔︎ 상속 : 기존 클래스를 재활용해서 새로운 클래스를 작성하는 자바 문법 요소
✔︎ 상위-하위 클래스 관계 : 하위 클래스는 상위 클래스가 가진 모든 멤버를 상속받음
✔︎ 상속을 사용하는 이유
① 코드를 재사용하기 때문에 보다 적은 양의 코드로 새로운 클래스 작성 가능 → 코드의 중복 제거
② 다형적 표현이 가능 : 하나의 객체가 여러 모양으로 표현될 수 있음
✔︎ 단일 상속(single inheritance)만 허용

☞ 상속 실습

package HelloJava;

public class HelloJava {
    public static void main(String[] args) {

        Person person = new Person();
        Programmer programmer = new Programmer();
        Dancer dancer = new Dancer();
        Singer singer = new Singer();

        person.name = "nasaram";
        person.age = 20;
        System.out.println(person.name);
        System.out.println(person.age);
        person.learn();
        person.walk();
        person.eat();
        System.out.println();

        programmer.name = "kimcoding";
        programmer.age = 28;
        System.out.println(programmer.name);
        System.out.println(programmer.age);
        programmer.companyName = "Naver";
        System.out.println(programmer.companyName);
        programmer.learn();
        programmer.walk();
        programmer.eat();
        programmer.coding();
        System.out.println();

        dancer.name = "leedancer";
        dancer.age = 23;
        System.out.println(dancer.name);
        System.out.println(dancer.age);
        dancer.groupName = "sewupa";
        System.out.println(dancer.groupName);
        dancer.learn();
        dancer.walk();
        dancer.eat();
        dancer.dancing();
        System.out.println();

        singer.name = "parksinger";
        singer.age = 35;
        System.out.println(singer.name);
        System.out.println(singer.age);
        singer.bandName = "buzz";
        System.out.println(singer.bandName);
        singer.learn();
        singer.walk();
        singer.eat();
        singer.singing();
    }
}

✔︎ 상위 클래스인 Person 클래스로부터 하위 클래스인 Programmer, Dancer, Singer 클래스들이 상속받아 Person클래스의 모든 멤버를 상속 받음

☞ 포함 관계

✔︎ 포함(composite) 관계 : 상속처럼 클래스를 재사용할 수 있는 방법으로, 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는 것
✔︎ 상속 관계 vs 포함 관계 구별법
✓ 상속 관계 : ~은 ~이다 (IS-A) 관계
✓ 포함 관계 : ~은 ~을 가지고 있다 (HAS-A) 관계

☞ 메서드 오버라이딩

✔︎ 메서드 오버라이딩(Method Overriding) : 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것
✔︎ 쉽게 말해 덮어쓴다는 말
✔︎ 메서드 오버라이딩 사용 조건 3가지
① 메서드의 선언부(메서드 이름, 매개변수, 반환타입)이 상위클래스의 선언부터와 완전히 일치해야 한다.
② 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다.
③ 예외는 상위 클래스의 메서드보다 많이 선언할 수 있다.

☞ super vs super()

✔︎ super : 상위 클래스의 객체
✔︎ super() : 상위 클래스의 생성자를 호출하는 것
✔︎ 둘 다 상위 클래스의 존재가 있고, 상속 관계가 전제됨
✔︎ super() 메서드는 앞서 공부한 this() 메서드와 동일하게 생성자 안에서만 사용이 가능하고, 반드시 첫 줄에 와야함

☞ Object 클래스

✔︎ Object 클래스 : 최상위 클래스, 모든 자바 클래스들은 Object 클래스로부터 확장됨
✔︎ 아무 것도 상속받지 않는 클래스에는 자동적으로 extends Object가 추가됨
✔︎ 따라서, 모든 클래스들은 Object 클래스의 멤버들을 자동으로 상속받아 사용 가능
ex) toString() - 객체 정보를 문자열로 출력, equals(Object obj) - 등가 비교 연산(==)과 동일하게 스택 메모리 값을 비교

  1. 캡슐화

⦿ 학습내용

☞ 캡슐화

✔︎ 캡슐화 : 특정 객체 안에 관련된 속성과 기능을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것
✔︎ 캡슐화 목적 두 가지
① 데이터 보호 목적
② 내부적으로만 사용되는 데이터에 대한 불필요한 외부 노출 방지
✔︎ ∴ 캡슐화의 가장 큰 장점 : 정보 은닉(data hiding)

☞ 패키지

✔︎ 패키지(package) : 특정 목적을 공유하는 클래스와 인터페이스의 묶음
✔︎ 패키지의 목적
① 클래스들을 그룹 단위로 묶어 효과적인 관리
② 클래스의 충돌 방지
✔︎ 계층 구조 간 구분은 점(.)으로 표현
✔︎ 패키지가 있는 경우 소스 코드의 첫 줄에 반드시 package 패키지명 표시
✔︎ import 문 : 다른 패키지 내의 클래스를 사용하기 위해 사용
✓ 일반적으로 패키지 구문과 클래스문 사이 작성
✓ import문 작성 방법

ìmport 패키지명.클래스명;

// 또는

import 패키지명.*;	// 해당 패키지의 모든 클래스

☞ 접근 제어자

✔︎ 제어자(Modifier) : 클래스, 필드, 메서드, 생성자 등에 부가적인 의미를 부여하는 키워드
✔︎ 크게 접근 제어자와 기타 제어자로 구분
✓ 접근 제어자 : public, protected, (default), private
✓ 기타 제어자 : static, final, abstract, native, transient, synchoronized
✔︎ 제어자는 하나의 대상에 여러 제어자를 사용 가능하나, 접근 제어자는 단 한번만💥 사용할 수 있음
✔︎ 접근 제어자(Access Modifier)
✔︎ 접근 제어자 사용시
✓ 클래스 외부로의 불필요한 데이터 노출 방지 (data hiding)
✓ 외부로부터 데이터가 임의로 변경되지 않도록 막을 수 있음
✔︎ 접근 제한 범위
✓ public(접근 제한❌) > protected(동일 패키지 + 하위 클래스) > default(동일 패키지) > private (동일 클래스)
✓ 표

☞ getter와 setter 메서드

✔︎ setter 메서드 : 외부에서 메서드에 접근하여 조건에 맞을 경우, 데이터 값을 변경 가능하게 해줌. 일반적으로 set-붙여 정의
ex. setName(매개변수)
✔︎ getter 메서드 : 설정한 변수 값을 읽어오는 데 사용. 일반적으로 get-붙여 정의
ex. getName()
✔︎ 이를 통해, 데이터를 효과적으로 보호하면서도 의도하는 값으로 변경하여 캡슐화를 보다 효과적으로 달성 가능

◉ 느낀 점

☞ 객체지향 프로그래밍에 들어오면서 확실히 이론적으로 이해가 되더라도 뭐가 다른지, 어디서 오류가 나타나는지 알기 위해 직접 실습해보며 공부해나가는 게 엄청 중요한 것 같다. 객체지향 프로그래밍의 핵심 4가지 (상속, 캡슐화, 다형성, 추상화) 중 두 가지를 오늘 공부하면서 확실히 직접 Intellij를 통해 코드를 쳐보면서 맞닥들인 상황에 대응하는 식으로 연습했다. 물론, 시간은 눈으로 읽는 거보다 수 배로 소요가 되지만, 나중을 위해서라도 뭔가 이렇게 공부해야될 것 같다고 감각적으로 느껴졌다😅 또한, 실시간 세션에서도 강사님께서 모두 사용되는 좋은 예시를 들어주며 흥미롭게 강의해주셔서 이해하는데 큰 도움이 된 것 같다 :)
아직 Intellij를 만지는 것부터 미숙하고 여러 단축키들을 알아가야 하지만 지금처럼 차근차근 커리큘럼에 맞게 한 단계씩 잘 따라가고, 밟아간다면 언젠간 빛을 발할 것이라 생각이 든다🔥

이제 다시 또 한 주가 시작됐다..! 점점 가는 길이 험할 것 같지만 이번 주도 화이팅 해보자구! 😤

◉ 내일의 키워드

・ 다형성
・ 추상화
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글