Notice
Recent Posts
Recent Comments
«   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
10-11 00:15
Archives
Today
Total
관리 메뉴

Developer_Neo

[코드스테이츠 백엔드 2기(40기) SEB BE] 13일차 본문

코드스테이츠

[코드스테이츠 백엔드 2기(40기) SEB BE] 13일차

_Neo_ 2022. 7. 11. 10:56
반응형

오늘 나의 학습 목표는 무엇인가요?

상위 클래스-하위 클래스의 상속 관계를 이해하고 extends키워드를 사용해 상속관계를 정의한다.
포함관계와 상속관계의 차이를 설명한다.
super와 super의 차이를 설명하고 오버라이딩을 활용해보자

캡슐화를 이해하고 import문이 어떻게 사용되는지 이해해보자
접근제어자 4가지를 알아보고 데이터를 효과적으로 보호하기 위한 수단인 getter/setter메서드를 이해하고 사용해보자

객체 지향 프로그래밍 설계의 핵심적인 것은 상속성, 캡슐화, 다형성, 추상화입니다.

 

상속

- 기존의 클래스를 재사용해 새로운 클래스를 작성하는 자바의 문법요소

- 코드를 재사용하여 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있어 코드의 중복을 제거하며 다형적 표현이 가능하다

- IS-A 관계

 

Car- 상위클래스 / 이외 - 하위클래스

class Car{
    protected String model;
    protected String color;

    Car(){}

    Car(String a,String b){
        model=a;
        color=b;
    }

    void start(){
        System.out.println("시동을 걸었다.");
    }

    void info(){
        System.out.println("이 차의 model은 " + model+", color 는 " + color);
    }
}

class Bmw extends Car{
    private boolean sun_loop;

    void open(){
        System.out.println("sun-loop is open");
    }
}

class Granger extends Car{
    private boolean auto_pilot;

    void auto(){
        System.out.println("auto pilot is start");
    }
}

- 자바의 객체지향 프로그래밍에서는 단일 상속만을 허용한다. 다중 상속은 허용되지 않는다라는 것입니다. C++은 다중상속이 된다.

- 왜 단일 상속만을 허용하는 이유는 다중 상속시 다이어몬드 문제라는 것이 발생하기 때문이다.

다중 상속

위의 사진을 보면 Child가 Father와 Mother를 다중상속하고 있다. Father와 Mother 각각은 Person의 추상메서드를 각각 구현했다고 하자. 이때 Child의 입장에서보면 Father와 Mother각각가지고 있는 메서드들 중에 어떤 것을 써야하는지 모르기때문에 컴파일 에러가 발생한다.

참고 : https://youngjinmo.github.io/2021/03/diamond-problem/

 


포함

- 상속과 클래스를 재 사용할 수 있습니다. 하지만 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는 것 입니다.

- HAS-A 관계

public class Employee {
    int id;
    String name;
    Address address;

    public Employee(int id, String name, Address address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    void showInfo() {
        System.out.println(id + " " + name);
        System.out.println(address.city+ " " + address.country);
    }

    public static void main(String[] args) {
        Address address1 = new Address("서울", "대한민국");
        Address address2 = new Address("서울", "대한민국");

        Employee e = new Employee(1, "김김김", address1);
        Employee e2 = new Employee(2, "이이이", address2);

        e.showInfo();
        e2.showInfo();
    }
}

class Address {
    String city, country;

    public Address(String city, String country) {
        this.city = city;
        this.country = country;
    }
}

Employee클래스 안에 Address클래스가 포함되어 있는 것을 발견할 수 있다.

 


메서드 오버라이딩

- 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것

 

3가지 조건

1. 메서드의 선언부(메서드 이름, 매개변수, 반환타입)이 상위클래스의 그것과 완전히 일치해야한다.
2. 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다.
3. 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.
class Car{
    protected String model;
    protected String color;

    Car(){}

    Car(String a,String b){
        model=a;
        color=b;
    }

    void start(){
        System.out.println("시동을 걸었다.");
    }

    void info(){
        System.out.println("이 차의 model은 " + model+", color 는 " + color);
    }
}

class Bmw extends Car{
    private boolean sun_loop;
    
    void start(){
        System.out.println("스마트키로 시동을 걸었다.");
    }
    
    void open(){
        System.out.println("sun-loop is open");
    }
}

super 키워드와 super()

super -  상위 클래스의 객체

super() - 상위 클래스의 생성자를 호출

              - this()와 마찬가지로 생성자 안에서만 사용가능하고, 반드시 첫 줄에 와야

 

(모두 상위 클래스의 존재를 상정하며 상속 관계를 전제)

 

- 두 개의 같은 이름의 변수를 구분하기 위한 방법이 바로 super 키워드

public class Super {
    public static void main(String[] args) {
        Lower l = new Lower();
        l.callNum();
    }
}

class Upper {
    int count = 20; // super.count
}

class Lower extends Upper {
    int count = 15; // this.count

    void callNum() {
        System.out.println("count = " + count);
        System.out.println("this.count = " + this.count);
        System.out.println("super.count = " + super.count);
    }
}

// 출력값
count = 15
count = 15
count = 20
public class Test {
    public static void main(String[] args) {
        Student s = new Student();
    }
}

class Human {
    Human() {
        System.out.println("휴먼 클래스 생성자");
    }
}

class Student extends Human { // Human 클래스로부터 상속
    Student() {    
        super(); // Human 클래스의 생성자 호출
        System.out.println("학생 클래스 생성자");
    }
}

// 출력값
휴먼 클래스 생성자
학생 클래스 생성자

모든 생성자의 첫 줄에는 반드시 this() 또는 super()가 선언되어야 한다

상위클래스의 생성자들 중 매개변수가 있는 것을 호출하기 원한다면 super의 소괄호안에 해당하는 매개변수를 넣어주면 됩니다.

 

만약 super()가 없는 경우에는 컴파일러가 생성자의 첫 줄에 자동으로 super()를 삽입합니다.

이때 상위클래스에 기본생성자가 없으면 에러가 발생하게 됩니다.

 


Object 클래스

- 자바 컴파일러는 컴파일링의 과정에서 다른 클래스로부터 아무런 상속을 받지 않는 클래스에 자동적으로 extends Object를 추가하여 Object 클래스를 상속받도록 합니다

- Object 클래스는 자바 클래스의 상속계층도에 가장 위에 위치

class Car{           //  컴파일러가 extends Object추가
    protected String model;
    protected String color;

    Car(){}

    Car(String a,String b){
        model=a;
        color=b;
    }

    void start(){
        System.out.println("시동을 걸었다.");
    }

    void info(){
        System.out.println("이 차의 model은 " + model+", color 는 " + color);
    }
}

 

Object 클래스의 메서드

메서드명 반환 타입 내용
toString() String 객체 정보를 문자열로 출력
equals(Object obj) boolean 등가 비교 연산(==)과 동일하게 스택 메모리값을 비교
hashCode() int 객체의 위치정보 관련. Hashtable 또는 HashMap에서 동일 객체여부 판단
wait() void 현재 쓰레드 일시정지
notify() void 일시정지 중인 쓰레드 재동작

 


캡슐화

- 특정 객체 안에 관련된 속성과 기능을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것

목적

1.  데이터 보호의 목적

2. 내부적으로만 사용되는 데이터에 대한 불필요한 외부 노출을 방지( 정보은닉 )

 


패키지

- 특정한 목적을 공유하는 클래스와 인터페이스의 묶음

- 클래스들을 그룹 단위로 묶어 효과적으로 관리하기 위한 목적

- 계층 구조 간 구분은 점(.)으로 표현

- 클래스의 충돌을 방지해주는 기능(같은 이름의 클래스를 가지고 있는 경우도 있다.)

 

(자바에서 패키지는 물리적인 하나의 디렉토리(directory)이고, 하나의 패키지에 속한 클래스나 인터페이스 파일은 모두 해당 패키지에 속해있습니다.)

package 패키지명

Import문

- 다른 패키지 내의 클래스를 사용하기 위해 사용

import 패키지명.클래스명; 또는 import 패키지명.*;

접근 제어자

자바에서 제어자는 크게 접근 제어자기타 제어자로 구분

접근 제어자 public, protected, (default), private
기타 제어자 static, final, abstract, native, transient, synchronized 등

각 대상에 대해서 접근 제어자는 단 한번만 사용가능하며, 기타제어자의 경우는 여러번 사용할 수 있다.

 

접근 제어자를 사용하면 클래스 외부로의 불필요한 데이터 노출을 방지(data hiding)할 수 있고, 외부로부터 데이터가 임의로 변경되지 않도록 막을 수 있습니다

접근 제어자 접근 제한 범위
private 동일 클래스에서만 접근 가능
default 동일 패키지 내에서만 접근 가능
protected 동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능
public 접근 제한 없음

default의 경우는 아무런 접근 제어자를 붙이지 않는 경우 기본적인 설정을 의미

 


getter와 setter 메서드

- private 접근제어자가 포함되어 있는 객체의 변수의 데이터 값을 추가하거나 수정하고 싶을 때

setter 메서드 는 외부에서 메서드에 접근하여 조건에 맞을 경우 데이터 값을 변경 가능하게 해주고 일반적으로 메서드명에 set-을 붙여서 정의합니다.

getter 메서드 는 이렇게 설정한 변수 값을 읽어오는 데 사용하는 메서드, get-을 메서드명 앞에 붙여서 사용

 

class Worker {
    private String name; // 변수의 은닉화. 외부로부터 접근 불가
    private int age;
    private int id;

    public String getName() { // 멤버변수의 값 
        return name;
    }

    public void setName(String name) { // 멤버변수의 값 변경
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age < 1) return;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

 


오늘 학습 내용 중 새롭게 배운 내용은 무엇인가요?
       -  내부 클래스에 대한 자세한 내용들

오늘 새롭게 학습한 내용을 다른 사람에게 설명할 수 있나요?
      - 네

오늘 학습한 내용 중 아직 이해되지 않은 불확실한 내용은 무엇인가요?
     -  없습니다.

이해되지 않은, 불확실한 내용을 보완하기 위해서 나는 무엇을 할 수 있을까요?
     -  구글링을 해본다.

나의 오늘 학습 만족도는 몇 점인가요?
     - 90점 (아는 내용들이라고 설렁설렁 넘어간 것들이 있는 것같다.)
반응형
Comments