PlayData 백엔드 부트캠프 정리

PlayData 백엔드 부트캠프 Start 7일차

효건 2024. 8. 17. 22:37

1. 접근 제한자 

  • Public
    • Public 특징 : 어디서든 참조가능한 클래스 필드 메서드 생성자에 대한 접근 권한이다. 따라서 제한자체가 없는것을 사용할때 붙인다.
  • Protected
    • Protected의 특징 : 같은 패키지와 상속받은 자식 클래스에서만 사용가능하다 따라서 상속여부가 판단 기준이 됨 
  • default
    • 같은패키지 내에서 접근 가능하다.  
  • Private
    • 같은 클래스 내에서만 접근 가능 , 다른 클래스에서 부르면 아예 없는 것으로 인지한다. 

※ 접근제한자를 사용하는 이유는 다음과 같다.

  • 굳이 사용자가 알지 않아도 되는 것을 가림으로써 보안성을 확보 할수있으며, 편의성도 가질수있다.

예를 들어서 비밀번호를 이용하여 로그인하는 방법을 가려서 보안성을 확보 할수 있으며 굳이 프로그램이 돌아가는 것을 보여줘서(변수의 주소를 여러가지 띄움) 사용자로 하여금 헷갈리게 하지 않아도 된다. 

다시말해 나와 같은 초보 개발자들이 굳이 Scanner의 구동방식을 알아서 그곳에 포함된 변수를 따라가서 수정해 다른것들을 꼬이지 않게 할수있다고볼수있다. 하지만 언젠가는 필요할수도있으니 계속 궁금해 하자!!!        

2. 정보 은닉과 캡슐화 ★★★★★

접근제한자에서 응용된 개념으로 볼수있다. Private 접근 제한자를  사용해야 하는 이유가 될수 있을 것으로 보인다.

  • 정보은닉
    • 매서드를 통해서만 초기화(변수저장)을 할수있도록 유도하는 과정이다.
    • 구현하는 순서는 다음과 같다. 
      1. 필드 변수에 Private 접근제한자 사용
      2. Setter와 Getter 메서드 만을 이용하여 사용 (단, 여기서 메서드는 Public으로한다. 그래야 다른곳에서사용이 가능하다)
      3. Setter는 유효성 검사를 담당하며, Getter는 숨겨진 필드값을리턴하는 행위를 담당한다.     

※ 여기서 불문율은 Setter매서드의 이름은 set + 맴버변수로하며 Getter매서드의 이름은 get+ 맴버변수로 한다. 

※ 여기서 사용하는 단축키는 alt + insert 키를 이용하여 창을 열어 getter 및 setter 를 선택하여 만든다.

  • 캡슐
    • 객체의 상태와 동작을 하나의 단위로 만드는 것을 의미한다. 
    • Setter와 Getter는 하나의 캡슐화로 볼수있다. 
    • 이러한 캡슐화는 객체를 간결하게 유지할수있어 가독성에서 유리한 포인트가 된다.

3. 상속

  • 상속의 정의
    • 부모의 클래스를 자식이 클래스를 물려받는 것을 뜻한다. 다시말해 상위 클래스를 그대로 가져와 수정이 가능하다는 것이다 .이는 결국 2번 사용하지 않아도 되는 편의성을 만들수 있으며 git의 commit 처럼 요류를 어느정도 방지 할 수 있다.   
  • 상속의 정리
    • 단일 상속만을 지원함. (JAVA)  -> 이는 죽음의 다이아몬드 현상을 방지 할 수 있어 오류를 피할 수 있다. 
    • 물려받은 클래스가 있으면 자식 클래스이다. 
    • 생성자는 상속이 되지않는다.
    • 상속시 extends 키워드를사용한다. EX) parents extends child 로 사용해야한다.
    • 자바는 기본적으로 객체지향언어로 Objesct클래스가 가장 최상위 클래스이다.  
  • 오버라이딩
    • 매서드 재정의를 사용하는 것을 말한다. 
    • 부모클래스에서 추가할 내용이 있으면 매서드 재정의를 이용하여 추가하면된다. 위에서 제시한 오류 방지및 편의성과 관련이 있는 내용이다. 
    • Super 키워드  는 부모클래스의 객체를 지목할때 사용되는 메서드이다. 여기서 주요 포인트는 super()를 통해 부모의 생성자를 호출하는 것이 가능하다.

4.사용제한자  Static과 final

  • Static
    • 프로그램이 시작할 때 메모리에 할당되고 프로그램이 종료될 때까지 유지되는 것을 이야기한다.
    • 정적 맴버는 정적 필드와 정적 메서드이다.
    • 정적 맴버는 정적는 객체와 무관하게 저장되는 공간이 따로 있다고볼수있다. 
    • 전역 변수는 모든 객체가 공유하는 전역변수이므로 어디서든 부를수있다. 
    • 대부분 고유의 값 고유의 상수로 사용될때 자주 사용된다.
  • Singleton
    • 솔직히 이해가 잘되지 않아 추후에 추가 해야 하는 내용
  • final
    • 더이상 변경없는 필드 재정의 없는 매서드 더이상 상속이 없느 클래스에서 사용한다.
    • 다시말해 이제 끝 수정허용 안하는 것을 말함. 절대 불변의 과학지식이나 수학 공식에 사용하면 될것으로 보인다.

 

5. 비전공자의 코딩테스트 연습(글당 3문제씩 할예정)

1) 정수 num1과 num2가 매개변수로 주어집니다. 두 수가 같으면 1 다르면 -1을 retrun하도록 solution 함수를 완성해주세요.(프로그래머스 문제- 숫자비교하기)

// 내답안 
class Solution {
    public int solution(int num1, int num2) {
        if(num1 == num2){
            return 1;
        }else{
            return -1;
        }
    }
}

// 신기한 답안 

class Solution {
    public int solution(int num1, int num2) {
        int answer = (num1 == num2) ? 1 : -1;
        return answer;
    }
}

 

if문이 만능의 해결방법이 아니다. 오히려 삼항연산자를 배웠던것을 생각해보면 좋을것으로 보인다.

삼항연산자가 어려워서 대충보았는데 생각보다 유용해 보인다. 삼항연산자는 아래와 같다 .

num1 과 num2거 같기에 1을 리턴받았고 다르면 -1을 리턴받는다 .

 

2) 머쓱이는 선생님이 몇 년도에 태어났는지 궁금해졌습니다. 2022년 기준 선생님의 나이 age가 주어질 때, 선생님의 출생 연도를 return 하는 solution 함수를 완성해주세요.

 

// 내 답안 
class Solution {
    public int solution(int age) {
        
       int teacher_age = 2022 - age +1;
        int answer = 0;
        return teacher_age;
    }
}

//다른사람 답안 

import java.time.*;
class Solution {
    public int solution(int age) {
        LocalDate today = LocalDate.now();
        return today.getYear() - age + 1;
    }
}

물론 내답안이 기준을 명확히 해서 좋긴 한데 다른사람 답안을 가져온이유는 다음과 같다.

먼저 import를 사용한점 LocalDate.now()라는 생성자를 생성한점이다.

LocalDate.now()라는 생성자를 배운적은 없지만 지금 날짜를 가져오는 생성자임을 배웠다. 

JAVA란 놈은 무시무시하게 뭐가 많은 것 같다.


2) 각에서 0도 초과 90도 미만은 예각, 90도는 직각, 90도 초과 180도 미만은 둔각 180도는 평각으로 분류합니다. 각 angle이 매개변수로 주어질 때 예각일 때 1, 직각일 때 2, 둔각일 때 3, 평각일 때 4를 return하도록 solution 함수를 완성해주세요.예각 : 0 < angle < 90

직각 : angle = 90

둔각 : 90 < angle < 180

평각 : angle = 180

 

//내 정답안
class Solution {
    public int solution(int angle) {
        if(0 < angle && angle <  90){
          return 1;            
        }else if(angle == 90){
            return 2 ;
        }else if(90 < angle && angle < 180){
            return 3;
        }else {
            return 4;
        }
    }
    
}


// 다른 사람 답안 
class Solution {
    public int solution(int angle) {
        return angle == 180 ? 4 : angle < 90 ? 1 : angle == 90 ? 2 : angle > 90 ? 3 : 0;
    }
}

 

이건 삼항연산도 아니고 뭘까 생각했는데 궁금띠 이건 추후 보완 예정