2022-05-12 데일리 회고 (After) 13일차

Sung-min Seo·2022년 5월 12일
0

⭐ 오늘의 학습 내용 📌

1. 상속 (Inheritance)

🥕 상속이란?

    코딩을 하다 보면 같은 내용의 코딩이 반복 되는 구간이 있다. 하지만 코드를 계속해서 반복하게 되면 매우 비효율적인 코드가 완성되게된다. 이를 방지하고자 OOP에서는 상속이라는 개념이 도입되었다.
    상속이란 상위 클래스가 가지고 있는 내용들을 하위 클래스에게 전달해주는 것을 뜻한다.
    이렇게 되면 상위 클래스에 반복되는 내용들을 집약해 놓고 하위 클래스에게 필요할 때마다 자신의 내용을 건내준다면, 코딩의 시간과 내용이 간편화 될수 있다.

1. 메서드 오버라이딩 (Method Overriding)

    메서드 오버라이딩은 하위 클래스가 상속 받는 중 일어나는 현상이다. 오버라이딩이 일어나기 위해서는 몇가지 조건이 필요하다.
      1. 하위 클래스에 상위클래스의 매서드와 같은 선언부를 가진 메서드가 있어야 한다.
      2. 하위 클래스의 접근 제한자가 상위 클래스보다 같거나 더 넓은 범위여야 한다.
      3. 하위 클래스는 상위클래스보다 많은 예외를 가질수 없다.

    📌 오버라이딩의 구조는 다음과 같다.

    class Ball{
    	void Speeds(){
      	System.out.println("공이 눈에 보여요!");
      }
    }
    
    class fast_ball extends Ball{   // fast_ball클래스가 Ball클래스를 상속 받았다.
    	void Speeds(){  //같은 이름을 상속받아 오버라이딩이 일어났다.
      	System.out.println("공이 눈에 안보여요!");  // 결과 값!!
      }
    } 
    🥕🥕 오버라이딩과 상속의 차이점!!

    2. this 와 this(), super 와 super()

      1. this
      메서드 오버로드를 사용하여 여러 매개 변수들을 가지게 되었을때 동일한 각 메서드 안에 동일한 변수명들을 가지게 된다. 이렇게 되면 변수명을 호출했을시 무슨 인스턴스의 변수가 호출 되는지 구분 하기가 매우 어려워진다. 이럴때 사용하는 것이 this 키워드 이다. this 키워드를 사용하면 현재 사용된 인스턴스의 변수 값으로 지정이 된다.

    📌 this 키워드의 예시

    public class Money{
    	public int count; //전역 변수 카운트를 지정
       
       public Money(int count){
       	this.count = count;	// this를 사용해 전역 변수가 아닌 생성자의 매개변수를 지정
       }
    	public static void main(String[] args){
       	Money coin = new Money(10); 		// 오버로드된 메서드로 인스턴스 생성
       	System.out.println("동전이 " + coin.count + "개 있습니다."); //  동전이 10개 있습니다.
       }
    }
      2. this()
      this()메서드는 this 키워드와 비슷하지만 몇가지 사용하기 위해서는 몇가지 조건을 가지고 있다.
        1. 반드시 생성자에서 첫번째로 쓰여야 한다.
        2. 반드시 생성자 내부에서 사용 되어야 한다.
      생성자 오버로드를 사용하는 경우 마찬가지로 여러 변수가 겹치게 되는 상황이 나오게 된다. 이럴때 this() 메서드를 사용하여 기본 생성자를 양식에 맞춰 불러올수 있다.

    📌 this() 키워드의 예시

    public class Money{
    	public int count; 
       public String tpe;
       public String color;
       
       public Money(int count){
       	this(penny, bronze);		// this(penny, bronze)가 먼저 호출된다. 
       	this.count = count;
       }
       
       public Money(String type, String color){
       	this.type = type;
        this.color = color;
       
       }
    	public static void main(String[] args){
       	Money coin = new Money(10);
       }
    }
      3. super 와 super()
      super 와 super()는 위의 this 키워드 와 this() 메서드와 같이 사용된다, 다만 자신을 뜻하는 것이 아닌 자신의 상위 클래스 혹은 부모 클래스를 받아 오는 것이 특징이다.
      super() 메서드 또한 this()메서드 처럼 2가지의 조건을 가지고 있다.

    2. 캡슐화 (Encapsulation)

    🥕 캡슐화의 필요성

      만약 게임을 하는데 이 게임을 플레이어가 마음대로 바꿀수 있다면 그 게임은 금세 망할 것이다. 혹은 은행에서 내 계좌의 비밀번호를 모두가 알수있다면 내 통장은 안전하지 않을 것이다.
      캡슐화는 정보의 은닉성에 중점을 둔 개념이다. 내가 만든 메소드나 생성자의 변수 값들을 서로 연관된 것들끼리 모아놓고 외부에서 함부로 바꿀수 없도록 제어 하는 것이다. 이렇게 되면 변수 값을 변경하거나 정하기 매우 번거롭지만, 보안성 면에서는 매우 뛰어나진다.

    1. 패키지 (Packages)

      비슷한 특징들을 공유하는 클래스들을 모아놓은 디렉토리를 패키지라고 부른다.
      GUI로 생각하자면 하나의 폴더에 비슷한 파일들을 정리해 놓는 개념이라고 생각하면 이해하기가 쉽다.
      이렇게 패키지대로 정리된 클래스들을 부를때는 import 라는 명령어를 사용해 현재 클래스에 불러올수 있다.

    2. 접근 제한자 (Access-Modifier)

      자바에서는 접근 제한자라는 객체 속성이 있어 각 객체가 활동할수 있는 범위를 정해준다.
        1. private : 같은 클래스 내에서만 접근이 가능하다.
        2. default : 같은 패키지 내에서만 접근이 가능하다.
        3. protected : 같은 패키지 혹은 상속되는 자식 클래스 내에서만 접근이 가능하다.
        4. public : 모든 곳에서 접근이 가능하다.

    3. getter 와 setter 메서드

      위의 2가지 개념들은 클래스를 보호하고 감추는 것에 중접을 둔 개념이다. getter 와 setter는 이렇게 보호되는 객체들로부터 값을 받아오고 지정해주는 역할을 해준다.
      1. setter
        객체의 값을 지정해주는 역할을 한다. 메서드 명 앞에 set을 붙혀준다.
      2. getter
        객체의 값을 받아오는 역할을 한다. 메서드 명 앞에 get을 붙혀준다.

    📌 get & set 예시

    class BaseBall{
    	private String type;
      
     	public String getType(){	//type 값을 get하여 받아주었다.
      		return type;
     	}
    	
      	public void setType(String t){  //type 값을 set 해준다고 선언
      		this.type = t;
      	}
    }
    
    class test{
    	public static void main(String[] args){
      
      	BaseBall ball = new BaseBall();
        
        ball.setType("baseball");	//set 값을 지정
        
        System.out.println(ball.getType());	//결과값 get을 출력
      }
    }
      그냥 String Ball = baseball; 이런 식으로 일반 변수로 바로 받으면 편하겠으나 위와 같이 get과 set을 이용하여 돌고 돌아 값을 지정해 주었다.
      매우 불편한 방법이지만 프로젝트의 범위가 커지거나 중요해지는 만큼 작업하고 있는 프로젝트의 보안상의 중요도 또한 커지게 되기 때문에 필요한 방법이다.
      또한 이렇게 set을 지정하게 되면 현재 코드가 어떻게 구현 되있는지 알지 못해도 set 값의 변경으로 원하는 값을 얻어낼수 있다. --> 냉장고의 원리를 몰라도 사용할수 있다!!

    ⭐ 오늘의 소감

    잠깐이나마 게임을 만들어 봤을때 가장 머리 아프게 고민했던 파트인 캡슐화 개념에 대해서 배우게 되었다. 어려운 개념이였지만, 그래도 어느정도는 경험이 있어서 그런지 어떤 상황에서 각 개념들이 필요한지 유추해 볼 수 있었다.

    profile
    매일 문제 3개 이상 풀기!!

    0개의 댓글