[코드스테이츠] S1.Unit7 회고

JinYoung Choi·2023년 1월 4일
0

이번엔 상속성, 캡슐화, 다형성, 추상화에 대해 배웠다.... 너무너무 어려웠다..

강사님께서 이 부분은 나중에 스프링을 배울때 가장 중요한 부분이라면서 이해를 반드시 완벽히 하고 들어가야 한다고 해서 복습만 5번씩 했다 근데 아직도 이해 못한 부분이 꽤 있다

그래도 복습 횟수가 늘어 날 수록 이해가 안되는 부분도 서서히 이해가 가기 시작했다

모두 이해 할때까지 복습은 멈추지 않을 것이다.. 누가 이기는지 보자..

그나마 다행인 점은 나만 어려워 하는 것은 아니란 점이다.

모두가 다 같이 어려워 하고 있어서 그나마 위안(?)이 됐다 휴..

상속

상속이란 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소

두 클래스를 상위 클래스와 하위 클래스로 나누어 상위 클래스의 멤버(필드, 메서드, 이너 클래스)를 하위 클래스와 공유하는 것을 의미

하위 클래스의 멤버 개수는 언제나 상위 클래스의 그것과 비교했을 때 같거나 많다

상속을 사용하는 이유 - 코드를 재사용하여 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있어 코드의 중복을 제거할 수 있다.

상속은 단일 상속만 허용하며 다중 상속은 허용하지 않는다.

class Person {
...}

class Programmer extends Person { 
...}

//상속 사용법 extends

포함 관계

포함(composite)은 상속처럼 클래스를 재사용할 수 있는 방법으로, 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는 것을 의미

public class Employee {
    int id;
    String name;
    Address address; //포함
    
    ...
 }
    
class Address {
    String city, country;
	...
    
 }
    

메서드 오버라이딩

메서드 오버라이딩(Method Overriding)은 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것을 의미

public class Main {
    public static void main(String[] args) {
        Bike bike = new Bike();
        
        bike.run();
    }
}

class Vehicle {
    void run() {
        System.out.println("Vehicle is running");
    }
}

class Bike extends Vehicle {
    void run() {
        System.out.println("Bike is running");
    }
}

// 출력값
Bike is running

상위 클래스의 메서드를 오버라이딩하기 위한 3가지 조건

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

super 키워드와 super()

super 키워드는 상위 클래스의 객체, super()는 상위 클래스의 생성자를 호출

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

Object 클래스

Object 클래스는 자바의 클래스 상속계층도에서 최상위에 위치한 상위클래스

Object 클래스는 자바 클래스의 상속계층도에 가장 위에 위치하기 때문에 Object 클래스의 멤버들을 자동으로 상속받아 사용할 수 있다

캡슐화

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

캡슐화의 목적

  • 데이터 보호
  • 내부적으로만 사용되는 데이터에 대한 불필요한 외부 노출 방지

패키지

패키지(package)란 특정한 목적을 공유하는 클래스와 인터페이스의 묶음

패키지는 클래스들을 그룹 단위로 묶어 효과적으로 관리하기 위한 목적을 가지고 있다

자바에 기본적으로 포함되어있는 대표적인 패키지로 자바의 기본 클래스들을 모아 놓은 java.lang, 확장 클래스를 묶어 놓은 java.util, 자바의 입출력과 관련된 클래스를 묶어놓은 java.io와 java.nio 등이 있다

장점 - 클래스의 충돌을 방지

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

import 패키지명.클래스명; 또는 import 패키지명.*; // 사용법

접근 제어자

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

접근 제어자를 붙이지 않으면 기본적으로 default가 된다

getter와 setter 메서드

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

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

getter 메서드는 이렇게 설정한 변수 값을 읽어오는 데 사용하는 메서드

다형성

한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것을 의미

자바의 다형성을 잘 활용하면 많은 중복되는 코드를 줄이고 보다 편리하게 코드를 작성하는 것이 가능해짐

참조변수의 타입 변환 - 사용할 수 있는 멤버의 개수를 조절할때 사용

타입 변환을 위해서는 세 가지 조건을 충족해야 함

  1. 서로 상속관계에 있는 상위 클래스 - 하위 클래스 사이에만 타입 변환이 가능
  2. 하위 클래스 타입에서 상위 클래스 타입으로의 타입 변환(업캐스팅)은 형변환 연산자(괄호)를 생략할 수 있다
  3. 반대로 상위 클래스에서 하위 클래스 타입으로 변환(다운캐스팅)은 형변환 연산자(괄호)를 반드시 명시

instanceof 연산자 - 참조변수의 타입 변환, 즉 캐스팅이 가능한 지 여부를 boolean 타입으로 확인할 수 있는 자바의 문법요소

참조_변수 instanceof 타입 // 사용법
public class InstanceOfExample {
    public static void main(String[] args) {
        Animal animal = new Animal();
        System.out.println(animal instanceof Object); //true
        System.out.println(animal instanceof Animal); //true
        System.out.println(animal instanceof Bat); //false

        Animal cat = new Cat();
        System.out.println(cat instanceof Object); //true
        System.out.println(cat instanceof Animal); //true
        System.out.println(cat instanceof Cat); //true
        System.out.println(cat instanceof Bat); //false
    }
}

class Animal {};
class Bat extends Animal{};
class Cat extends Animal{};

추상화

추상화는 기존 클래스들의 공통적인 요소들을 뽑아서 상위 클래스를 만들어 내는 것

abstract 제어자 - 메서드 앞에 붙은 경우를 ‘추상 메서드(abstract method)’, 클래스 앞에 붙은 경우를 ‘추상 클래스(abstract class)’라 각각 부른다

추상 클래스는 상속 관계에 있어 새로운 클래스를 작성하는데 매우 유용

추상 클래스를 사용하면 상속을 받는 하위 클래스에서 오버라이딩을 통해 각각 상황에 맞는 메서드 구현이 가능하다는 장점이 있다

final 키워드 - final 키워드는 필드, 지역 변수, 클래스 앞에 위치할 수 있으며 그 위치에 따라 그 의미가 조금씩 달라지게된다

클래스 - 변경 또는 확장 불가능한 클래스, 상속 불가
메서드 - 오버라이딩 불가
변수 - 값 변경이 불가한 상수

인터페이스

인터페이스를 작성하는 것은 기본적으로 클래스를 작성하는 것과 유사하지만, class 키워드 대신 interface 키워드를 사용

일반 클래스와 다르게, 내부의 모든 필드가 public static final로 정의되고, static과 default 메서드 이외의 모든 메서드가 public abstract로 정의

public interface InterfaceEx {
    public static final int rock =  1; // 인터페이스 인스턴스 변수 정의
    final int scissors = 2; // public static 생략
    static int paper = 3; // public & final 생략

    public abstract String getPlayingNum();
		void call() //public abstract 생략 
}

인터페이스는 다중적 구현이 가능

class ExampleClass implements ExampleInterface1, ExampleInterface2, ExampleInterface3 { 
				... 생략 ...
}

장점 - 기능이 가지는 역할과 구현을 분리시켜 사용자로 복잡한 기능의 구현이나 교체/변경을 신경쓰지 않고도 코드 변경의 번거로움을 최소화하고 손쉽게 해당 기능을 사용할 수 있도록 한다
반대로 기능을 구현하는 개발자의 입장에서도 선언과 구현을 분리시켜 개발시간을 단축할 수 있고, 독립적인 프로그래밍을 통해 한 클래스의 변경이 다른 클래스에 미치는 영향을 최소화할 수 있다는 큰 장점 이 있다

profile
백엔드 취준생

0개의 댓글