코드스테이츠 백엔드 10일차 회고록
배운점
1. 생성자(Constructor)
- 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메소드
new키워드를 통해 객체를 생성할 때 호출되는 메소드- 생성자 이름은 반드시 클래스의 이름과 같아야한다
- 생성자는 리턴 타입이 없다
- 메소드 오버로딩이 가능하다
- 생성자를 작성하지 않으면 컴파일러에서 기본 생성자를 생성해준다
- this() 메소드를 통해 다른 오버로딩된 생성자를 불러올 수 있다
2. 내부 클래스(Inner Class)
class Outer { // 외부 클래스
class Inner { // 인스턴스 내부 클래스
}
static class StaticInner { // 정적 내부 클래스
}
void run() {
class LocalInner { // 지역 내부 클래스
}
}
}
- 클래스 내에 선언된 클래스
- 클래스를 논리적으로 그룹화 할 수 있다
- 캡슐화, 코드의 가독성에 도움이 된다
| 종류 | 선언위치 | 사용 가능한 변수 |
|---|---|---|
| 인스턴스 내부 클래스(instance inner class) | 외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스) | 외부 인스턴스 변수, 외부 전역 변수 |
| 정적 내부 클래스(static inner class) | 외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스) | 외부 전역 변수 |
| 지역 내부 클래스(local inner class) | 외부 클래스의 메소드나 초기화 블록 안에 선언 | 외부 인스턴스 변수, 외부 전역 변수 |
실습 문제
LoL_Program.java
public class LoL_Program {
public static void main(String[] args) {
Charactor a = new Charactor();
Charactor b = new Charactor();
a.user_create();
b.user_create();
Charactor.attack(a, b);
}
}
LoL_char.java
import java.util.Scanner;
public class Charactor {
String name;
int ad;
int def;
int hp;
public void create_info() {
System.out.println();
System.out.println("[안내] 생성된 유닛 정보는 다음과 같습니다.");
System.out.println("[안내] "+this.name+" 유닛이 게임에 참여하였습니다.");
}
public void user_info() {
System.out.println("[공격력] : " + this.ad);
System.out.println("[방어력] : " + this.def);
System.out.println("[체력] : " + this.hp);
System.out.println();
}
public void user_create() {
Scanner sc = new Scanner(System.in);
System.out.print("[시스템] 유닛 [이름] 을 입력해 주세요 : ");
this.name = sc.next();
System.out.print("[시스템] 유닛 [공격력] 을 입력해 주세요 : ");
this.ad = sc.nextInt();
System.out.print("[시스템] 유닛 [방어력] 을 입력해 주세요 : ");
this.def = sc.nextInt();
System.out.print("[시스템] 유닛 [체력] 을 입력해 주세요 : ");
this.hp = sc.nextInt();
create_info();
user_info();
}
public static void attack(Charactor a, Charactor b) {
while(true) {
b.hp = (b.hp + b.def) - a.ad;
System.out.println("[안내] "+a.name+"유닛이 공격 하였습니다");
if(b.hp <= 0) {
System.out.println("[안내] 상대 유닛("+b.name+")이 제거되었습니다.");
break;
}
else {
System.out.println("[안내] 상대 유닛의 남은 [체력은] "+b.hp+" 입니다.");
}
a.hp = (a.hp + a.def) - b.ad;
System.out.println("[안내] "+b.name+"유닛이 공격 하였습니다");
if(a.hp <= 0) {
System.out.println("[안내]" +a.name+"이(가) 파괴되었습니다.");
break;
}
else {
System.out.println("[안내] 내 유닛의 남은 [체력은] "+a.hp+" 입니다.");
}
}
System.out.println("[안내] 게임을 종료합니다.");
}
}
느낀점
오늘은 생성자와 내부 클래스에 대해 배웠다.
예전에 공부 할 때 내부 클래스 부분을 소홀히 공부했는지
처음 보는 것 같기도 했고, 잘 이해가 안갔었다.
가장 이해가 안됐던건 내부 클래스를 왜 사용하는가 였다.
인터넷에 검색해보니까 내부 클래스를 사용하면
클래스 파일을 하나 더 적게 생성 할 수 있고
클래스의 연결 관계가 간결해져서 가독성이 좋아지고
캡슐화를 더 단단하게 해줄 수 있다. 라고 나와있었다.
정확한 실습을 하지 않아서 완전히 이해하진 않았지만
어느 맥락에서 사용되는지 이해는 갔다.
앞으로 코딩을 할 때 내부 클래스를 사용하는 방법을
익혀야겠다고 생각했다.
댓글남기기