오늘 진행한 학습 요약
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 |
- 추상화의 개념 및 활용
- 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("야옹!");
}
}