TIL

[11일차] TIL

joooii 2025. 9. 8. 23:28

[1] 오늘 공부한 내용 📝

객체지향

캡슐화

  • private, default(생략), protected를 이용해서 캡슐로 쌓는
  • public한 메서드(getter, setter)를 제공해야 한다
  • 목적
    1) 보호
    2) 은닉 ( -> decouple 효과 및 유지보수성을 높임)

⁉️ Getter, Setter란?

Getter

  • private를 외부로 꺼내는 메서드
  • 매개변수는 없고, 리턴값만 메서드로 정의
  • getXXX() 형식

Setter

  • private에 값을 넣는 메서드
  • 리턴값은 없고, 매개변수만 메서드로 정의
class Student {
    // private 멤버 변수 (외부에서 직접 접근 불가)
    private String name;
    private int age;

    // Getter (매개변수 없음, return 값 있음)
    public String getName() {
        return name;   // name을 리턴
    }

    public int getAge() {
        return age;    // age를 리턴
    }

    // Setter (매개변수 있음, return 값 없음)
    public void setName(String name) {
        this.name = name;   // 전달받은 값을 멤버 변수에 저장
    }

    public void setAge(int age) {
        this.age = age;     // 전달받은 값을 멤버 변수에 저장
    }
}

public class Main {
    public static void main(String[] args) {
        Student s = new Student();

        // Setter 사용 (값 넣기)
        s.setName("홍길동");
        s.setAge(23);

        // Getter 사용 (값 꺼내기)
        System.out.println("이름: " + s.getName());
        System.out.println("나이: " + s.getAge());
    }

(참고)
-> 객체지향 원칙 중 '정보은닉'이 있는데, private로 숨겨놓은 필드를 getter로 조회하고, setter로 수정할 수 있다면, 정보은닉 원칙을 해칠 수 있기 때문에 지양하는 것이 좋다고 한다!
-> 추후 백엔드 공부할 때 자세히 공부하면 좋을 것 같다.


상속

  • 상속 대상: 속성, 메서드
  • 생성자는 상속에서 제외 대상이다. (생성자 이름 = 클래스 이름인데, 상속 시 부모클래스이름과 생성자 이름이 같아져버리기 때문에 에러가 발생. 대신 필요시에 호출을 통해서 재사용이 가능하다.)
  • 생성 -> 재사용
  • 상속 -> 재사용 + 수정
  • 재사용하기 위해 상속을 하는 것이면 생성. 재사용하기 위해 상속을 받는 것은 성능 저하를 일으킨다.
  • 수정을 하기 위해서 상속을 받는 것이 기본 생각이다.
  • 이때 클래스는 단일 상속을 지원하는데, 인터페이스(interface)는 다중 상속도 지원한다.
  • 상속 받은 속성이 private일 경우, 접근 불가하기 때문에 Setter / Getter를 통해 접근한다.

오버라이드 (Override) (재정의)

규칙 : 메서드 이름, 인자, 리턴 타입이 동일해야 한다.
효과 : 메서드 이름, 인자, 리턴 타입이 기존 코드와 동일하므로 코드를 따로 수정하지 않고, 변경된 내용을 반영할 수 있다.

🌟 super()

  • Override에 의해서 무시된 상속 받은 멤버(메서드, 속성)을 호출할 때 super()를 통해 접근 가능하다.
  • super.메서드이름
  • super.속성

추상 클래스 (Abstract)

Abstract는 final, static과 같이 쓸 수 없다.

  • abstract : 반드시 상속을 하겠다 / 동적이다
  • final : 상속을 하지 않겠다
  • static : 정적이다
    => 서로 이해상충되기 때문에 같이 쓸 수 없다 (final과 static은 이해상충되지 않기 때문에 같이 사용 가능)

부모에서 abstract로 선언했을 때, 자식은 무조건 이에 관한 내용이 구현되어 있어야 한다.


interface

  1. 다중상속
  2. 상수와 추상메서드로만 구성되어 있다.

추상메서드

  • 메서드의 선언부만 작성하고, 구현 X

static

static을 붙이면 메모리에 미리 올라가기 때문에 객체 생성없이 클래스명으로 접근이 가능하다.
종류: Arrays.binarySearch(), Arrays.toString(), Arrays.sort(), Math.random(), Math.ceil() 등


sort()

int 타입 : Integer.compare()
문자열 타입 : 비교대상.compareTo(내 대상)

Comparator : 해당 클래스가 Comparable을 구현하지 않았거나, 다른 방식으로 정렬할 때 Comparator를 두 번째 인자로 전달한다.
형태: Arrays.sort(기준 데이터, 람다식)


알고리즘

재귀함수

1) 정의 : 함수 안에 자신의 함수를 다시 호출하는 함수
2) for문과의 차이

  1. depth를 내 마음대로 설정할 수 있다.
  2. 모든 반복문은 재귀로 쓸 수 있지만, 모든 재귀함수는 반복문으로 쓸 수 없다.
    3) 작성 형태
  3. 반복할 코드
  4. 초기값 설정
  5. 중단 조건 (기저조건)
  6. 반복으로 가기 위한 유도 파트 (<- 3번 조건으로 가기 위한 값 (증/감))
    4) 반복 변수 필수

🌟 재귀함수와 for문의 차이를 코드로 표시

for (int i = 0; i < 10; i++) {
    // 반복할 코드
}

for (초기값; 중단 조건; 반복을 중단하기 위한 유도값) { }
// 반복문은 자체적으로 반복을 유도한다.

for문 예시

  public static void a(int i) {
    // 중단 조건: 기저 조건
    if (i == 10) return; 

    a(i+1) // 반복하기 위한 유도값
}

🌟 재귀함수 작성 방법

1) 기저 조건 (반복을 중단하기 위한 조건)

기저조건일 때의 재귀함수 코드

 

2) 특정 조건일 때 반복(재귀) 유도

특정 조건일 때의 재귀함수 코드

🌟 Bottom-Up, Top-Down 형태

1) Bottom-Up : 오름차순 정렬
2) Top-Down : 내림차순 정렬


[2] 어려웠던 내용 😇

  • 객체지향의 모든 것이 어려웠다..
  • 재귀함수를 구현할 때, sum과 factorial을 구현하는 시간이 있었는데, 누적합(곱)을 total에 담는 방법을 몰라 GPT의 도움을 살짝 빌렸다. 이 부분이 조금 아쉬웠으나, 해결책은 static int total = 0를 전역함수로 설정해두고, main 함수에서 total=0으로 매번 초기화하는 방법을 사용했다. (한 파일에서 4종류의 재귀함수를 구현하고 있었기 때문에)
  • 특히, 누적곱은 total = 0이 아닌, total = 1에서 시작해야 한다는 점도 기억해두자.
public class FactorialTest {
    static int N = 5;
	static int total = 1; // 누적곱 <- 0으로 하면 누적곱 = 0 

    // 기저조건 Bottom -> up (오름차순)
    public static void print1(int i) {
        if (i > N) return;
        total *= i;
        print1(i+1);
    }
    public static void main(String[] args) {
        total = 1;
        print1(1);
    }
 }

 

[3] 궁금한 내용 / 부족한 내용 ⁉️

  • 객체지향 부분은 백엔드를 배워야 내가 뭐가 궁금하고, 부족할 지 알 수 있을 것 같다.

[4] 느낀 점 📮

6시에 일어나기 성공했다 ㅜ
객체지향은 학교 강의 재수강 + 부트캠프 강의를 들어도 매번 새로운 것 같다.. 자바랑 하염없이 멀어지는 중
그리고 알고리즘을 실제로 풀어봐야 자바 문법에 익숙해질 것 같다
TIL 작성하는 법은 아래 링크를 참고했다. 오늘 공부한 내용 전체는 노션을 통해 정리하고, TIL에서는 유독 어려웠던 파트를 정리하는 편이 깔끔할 것 같다
더 열심히..........

https://velog.io/@pyotato/TIL2023.04.15TIL%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8D%A8%EC%95%BC%EB%90%A0%EA%B9%8C

 

[TIL] [2023.04.15]TIL은 어떻게 써야될까?🤔

🤔 TIL 작성법에 대해 새로 고민을 하게 된 날🎯 TIL=개발공부하면서 새로 배운점➕개발 흔적➕어려움➕해결과정➕아쉬운점

velog.io

TIL 관리자님 밈 잠깐 빌리겠습니다 .. ㅎㅎ
다음 TIL 부턴 알찬 이미지로 사용할게요