Today I Learned

2024 스파르타 내일배움캠프 Sping 트랙 참여 // day16

shinelee26 2024. 10. 23. 21:59

오늘 진행한 학습 요약

1. Class 특강

  • Class란?
  • 객체란?
  • 인스턴스란?
  • 인스턴스변수란?
  • 클래스변수란?
  • 지역변수란?
  • 전역변수(멤버변수)란?

2. CH 2 숫자 야구 게임 과제

  • Lv 3. 추가 기능 및 개선 (숫자 야구 게임)
  • Lv4. 추가 기능 및 개선 (숫자 야구 게임)
JAVA 숫자야구게임 Git-hub 링크 :https://github.com/chews26/WordleGame/tree/main

 

3. 상속과 추상화 개념 공부

  • 상속의 개념 및 활용
  • 추상화의 개념 및 활용
자바의 정석 - 기초편 상속 : https://youtu.be/Pgutf0G3nE4?si=W0txOkSHpJLCgy6d
자바의 정석 - 기초편 추상클래스, 추상메서드 : https://youtu.be/9VgkoVFZvyk?si=X7dt9sWbG9rvJFL7

 

4. 알고리즘 코드카다  Day8 (작성 생략)

CodingTest Git-hub 링크 : https://github.com/chews26/CodingTest

 

5. learn git branching (작성 생략)

LearnGitBranching 링크 : https://learngitbranching.js.org/?locale=ko

학습 정리

1. Class 특강

  • Class란?
    • Class란 설계도, 메서드를 정의
  • 객체란?
    • 메모리에 생성된 구체적인 대상
  • 인스턴스란?
    • 클로스로 생성된 구체적인 객체
  • 인스턴스변수란?
    • 선언 위치: 클래스 내부, 메서드 외부.
    • 메모리 할당 시점: 객체가 생성될 때(heap 메모리).
    • 생존 기간: 객체가 참조되는 동안(객체가 더 이상 참조되지 않으면 GC에 의해 회수됨).
    • 접근 방법: 객체를 통해 접근 (객체명.변수명).
  • 클래스변수란?
    • 선언 위치: 클래스 내부, 메서드 외부. static 키워드 사용.
    • 메모리 할당 시점: 프로그램이 시작되고 해당 클래스가 메모리에 로드될 때 (메서드 영역).
    • 생존 기간: 프로그램이 종료될 때까지.
    • 접근 방법: 클래스명으로 접근 가능 (클래스명.변수명), 객체를 통해서도 접근 가능하지만 권장되지 않음.
  • 지역변수란?
    • 선언 위치: 메서드나 생성자, 또는 특정 블록 내부.
    • 메모리 할당 시점: 메서드나 블록이 호출될 때(스택 메모리).
    • 생존 기간: 메서드 또는 블록이 실행되는 동안.
    • 접근 방법: 선언된 블록 내에서만 접근 가능.
  • 멤버변수(전역변수)란?
    • 클래스의 속성을 정의하는 변수로, 클래스 내부에 선언된 변수  
    • 클래스 전체에서 접근가능한
    • 인스턴스 변수 (Instance Variable)
    • 클래스 변수 (Class Variable, static 변수)

 

변수 종류 선언 위치 메모리 할당 시점 생존 기간 접근 방법
인스턴스 변수 클래스 내부, 메서드 외부 객체가 생성될 때 객체가 존재하는 동안 객체를 통해 접근
클래스 변수 클래스 내부, static 키워드 사용 클래스가 메모리에 로드될 때 프로그램이 종료될 때까지 클래스명으로 접근
지역 변수 메서드나 블록 내부 메서드나 블록이 실행될 때 메서드나 블록이 종료될 때까지 선언된 블록 내에서만 접근 가능

 


2. CH 2 숫자 야구 게임 과제

Lv 3. 추가 기능 및 개선 (숫자 야구 게임)
1. 게임 기록 통계
2. 출력 개선
  • Lv4 추가 기능 및 개선을 진행하기 위해 레벨별로 클래스를 신규 생성하였다. 하지만 이 과정에서 게임을 재 시작할 때 게임 기록 통계가 집계되지 않는 문제점이 발생하였다.
  • 부모 클래스에서 변수를 가져오는데 super 키워드를 추가하지 않아서 생긴 문제라고 생각하고 관련 변수에 super.을 작성하였으나 그래도 게임 기록통계가 집계되지 않았다.
  • RandomList -> GamePlay -> Level*Game순으로 상속을 진행하였는데 tryCount 변수는 RandomList에 선언하고 super는 손자격인 Level*Game에서 호출하였던 것이 문제였다.
  • 자식클래스는 자신의 부모클래스의 생성자만 호출 가능하며 그 이상의 부모클래스는 생성자를 직접 호출할 수 없다.
  • 이를 해결하기 위한 방법은 두가지가 있었다.
    • 부모클래스의 생성자에서 조부모클래스의 생성자를 호출하기
    • tryCount변수를 부모클래스에서 선언하기
  • tryCount변수는 어차피 가장 하위 클래스인 Level*Game클래스에서 밖에 쓰지 않았고 유지보수와 안정성을 위해 tryCount변수를 부모클래스인 Game Play에 선언하여 해결하였다.

Lv 4. 추가 기능 및 개선 (숫자 야구 게임)
1. 게임 난이도 조절
  • 게임 난이도 조절을 위해 위 사진처럼 레벨별로 클래스를 나누고 관련 클래스를 상속받았다.
  • 이 과정에서 레벨별로 배열의 크기가 달라 난이도가 달라지면 제대로 게임이 실행되지 않는 문제점을 발견하였다.
  • 따라서 레벨별로 구분하기 위해 세개의 랜덤값 배열을 선언하고 레벨별로 메서드를 작성하였다.
  • 또한 작성중에 random1로 작성해야하는 부분에 random2로 변수를 잘못 작성하여 실행이 되지 않는 문제점도 있었다.
  • 어디서 문제가 발생하는지 찾기 위해 디버깅을 진행하였고 랜덤값을 생성하는 과정에서 실행이 멈추는 것을 확인하여 변수명을 알맞게 고쳐 해결하였다. 

3. 상속과 추상화 개념 공부

  • 상속의 개념 및 활용
    • 자손은 조상의 모든 멤버를 상속받는다.
    • 자손은 조상의 코드를 재사용할 수 있어 중복을 줄일 수 있다.
    • 자손은 조상의 코드를 유연하게 확장해 사용할 수 있다.
    • 하지만 생성자, 초기화 블럭은 제외이다.
    • public, protected,  default는 동일패키지내에서 접근가능하며 Private는 getter,setter을 사용해 간접적으로 접근이 가능하다.
접근 제어자 클래스 내에서 동일 패키지 다른 패키지의 하위 클래스 다른 패키지
public O O O O
protected O O O X
default O O X X
private O X X X

 

 

상속 | Notion

Java에서 상속(Inheritance)은 객체 지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 개념 중 하나로, 기존 클래스(부모 클래스 또는 상위 클래스)의 속성(필드)과 메서드(행동)를 새로운 클래스(자

shinelee26.notion.site

 

  • 추상화의 개념 및 활용
    • abstract 키워드를 사용하여 선언되며, 객체를 직접 생성할 수 없는 클래스
    • 쉽게 말하면 중괄호 {} 가 없다.
    • 추상클래스는 하위 클래스에서 재 정의 해줘야한다.
    • 동물은 소리를 낼 수 있다는 공통점이 있는데 동물마다 내는 소리가 다를때 추상클래스를 쓰는것이다.
    • ??? 소리를 낸다 -> 추상메서드
    • 고양이 야옹 소리를 낸다.
    • 강아지 멍멍 소리를 낸다
interface Animal {
    void sound(); // 추상 메서드
}

class Dog implements Animal {
    @Override
    public void sound() {
        System.out.println("멍멍!");
    }
}

class Cat implements Animal {
    @Override
    public void sound() {
        System.out.println("야옹!");
    }
}
 

추상화 | Notion

Java의 **추상화(Abstraction)**는 객체 지향 프로그래밍(OOP)의 네 가지 핵심 원칙 중 하나로, 복잡한 시스템의 세부 구현을 숨기고 중요한 부분만 드러내는 방법을 의미합니다. 추상화를 통해 사용자

shinelee26.notion.site