2 분 소요

배운점

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("[안내] 게임을 종료합니다.");
    }
}

느낀점


오늘은 생성자와 내부 클래스에 대해 배웠다.

예전에 공부 할 때 내부 클래스 부분을 소홀히 공부했는지
처음 보는 것 같기도 했고, 잘 이해가 안갔었다.

가장 이해가 안됐던건 내부 클래스를 왜 사용하는가 였다.

인터넷에 검색해보니까 내부 클래스를 사용하면
클래스 파일을 하나 더 적게 생성 할 수 있고
클래스의 연결 관계가 간결해져서 가독성이 좋아지고
캡슐화를 더 단단하게 해줄 수 있다. 라고 나와있었다.

정확한 실습을 하지 않아서 완전히 이해하진 않았지만
어느 맥락에서 사용되는지 이해는 갔다.

앞으로 코딩을 할 때 내부 클래스를 사용하는 방법을
익혀야겠다고 생각했다.

댓글남기기