Coding History

국비 지원 IT(웹앱개발) 취업반 강의 10일차

BlackBirdIT 2024. 6. 19. 17:39

먼저 숙제 문제 풀이를 진행하면서 abstract에 대해서 배웠다. abstract는 부모 클래스의 메서드에 어떤 기능을 작성할 수 없게끔 강제하는 코드이다. 강사님은 부모 클래스에서 어떤 기능을 작성한다는 것은 의미가 없는 행동이라고 하셨는데 대게 자식 클래스에서 오버라이딩하기 때문에 그런 것 같다. abstract를 사용한 코드 예제를 보자.

class 땡땡 {
    abstract void 땡땡 (); //abstract 사용.
}



interface 땡땡 {
    void 땡땡 (); // abstract는 생략됨
}

class 땅땅 implements 땡땡 { //interface에게 상속받으려면 extends가 아니고 implements로 상속함.
    //implements는 다중상속이 가능하다.(어차피 오버라이드 해야하기 때문에 애매한 상황이 없다.)

}

보면 interface와 implements가 있는데 예제 코드 안에 각주로 몇가지 써져있다. interface는 abstract void만 클래스안에 존재할 때 class로 명명하는 것이 아닌 interface로 사용할 수 있고, absract는 생략하고 void만 쓸 수 있다.

아무튼 이런 개념을 배웠고 수업중 풀었던 문제중 중요한 것만 올려보면,

class Main2 {
    public static void main(String[] args) {
        전사 a전사 = new 전사();
        String 이름 = "칸";
        a전사.이름 = 이름;
        a전사.나이 = 20;
        a전사.자기소개();

        a전사.이름 = "뷁";
        a전사.나이++;
        a전사.자기소개();

        a전사.나이 = 30;
        a전사.이름 = "카니";
        a전사.자기소개();

        a전사.a무기 = new 활();
        a전사.공격();
        // 출력 : 카니가 활로 공격합니다.

        a전사.a무기 = new 칼();
        a전사.공격();
        // 출력 : 카니가 칼로 공격합니다.
    }
}

class 전사 {
    String 이름;
    int 나이;
    무기 a무기;

    void 자기소개() {
        System.out.println("안녕하세요. 저는 " + this.나이 + "살 " + this.이름 + " 입니다.");
    }

    public void 공격() {
        a무기.작동(this.이름);
    }

}

class 무기 {
    void 작동(String 공격자이름) {

    }
}

class 칼 extends 무기 {

    void 작동(String 공격자이름) {
        System.out.println(공격자이름 + "가 칼로 공격합니다.");
    }
}

class 활 extends 무기 {

    void 작동(String 공격자이름) {
        System.out.println(공격자이름 + "가 활로 공격합니다.");
    }
}

여기가 매개변수를 활용해서 전사의 자기 소개와 공격을 했을 때 어떤 전사가 어떤 무기로 공격을 하는지 출력해주는 코드고,

class 전사 {
    String 이름;
    int 나이;
    무기 a무기;

    void 자기소개() {
        System.out.println("안녕하세요. 저는 " + this.나이 + "살 " + this.이름 + " 입니다.");
    }

    public void 공격() {
        System.out.println(this.이름 + "(이)가 " + this.a무기 + "로 공격합니다.");
    }

}

class 무기 {

}

class 칼 extends 무기 {
    public String toString() {
        return "칼"; //리턴 값을 "칼"을 갖도록 함.
    }
}

class 활 extends 무기 {
    public String toString() {
        return "활";
    }
}

이게 매개변수 없이 풀어보라고 하셔서 내가 풀어본 코드다.

// 문제 : 아래가 실행되도록 해주세요.

class Main2 {
    public static void main(String[] args) {
        전사 a전사 = new 전사();
        String 이름 = "칸";
        a전사.이름 = 이름;
        a전사.나이 = 20;
        a전사.자기소개();

        a전사.이름 = "뷁";
        a전사.나이++;
        a전사.a무기 = new 칼();
        a전사.자기소개();
        a전사.공격();

        a전사.나이 = 30;
        a전사.이름 = "카니";
        a전사.자기소개();

        a전사.a무기 = new 활();
        a전사.공격();
        // 출력 : 카니가 활로 공격합니다.

        a전사.a무기 = new 칼();
        a전사.공격();
        // 출력 : 카니가 칼로 공격합니다.
    }
}

class 전사 {
    String 이름;
    int 나이;
    무기 a무기;

    void 자기소개() {
        System.out.println("안녕하세요. 저는 " + this.나이 + "살 " + this.이름 + " 입니다.");
    }

    public void 공격() {
        a무기.공격자명 = 이름;
        a무기.작동();
    }

}

class 무기 {
    String 공격자명;
    void 작동(){
    }
}

class 칼 extends 무기 {
    void 작동(){
        System.out.println(공격자명 + "칼로 공격합니다.");
    }
}

class 활 extends 무기 {
    void 작동(){
        System.out.println(공격자명 + "활로 공격합니다.");
    }
}

이게 강사님 풀이다.

생성자에 대해서 배웠다.

  • 생성자(constructor)
    자바에서는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 생성자(constructor)라는 메소드를 제공한다.
    자바에서 생성자(constructor)의 이름은 해당 클래스의 이름과 같아야 한다.
    이러한 생성자는 다음과 같은 특징을 가진다.
  1. 생성자는 반환값(return)이 없지만, 반환 타입을 void형으로 선언하지 않는다.
  2. 생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있다.
  3. 객체를 초기화하는 방법이 여러 개 존재할 경우에는 하나의 클래스가 여러 개의 생성자를 가질 수 있다.
    즉, 생성자도 하나의 메소드이므로, 메소드 오버로딩이 가능하다는 의미다.
  • 예제 코드
class Main2 { 
    public static void main(String[] args) {
    사람 사람1 = new 사람("김철수", 22); //new가 생성자를 불러온다. 
    System.out.println("==사람1 정보=="); 
    System.out.printf("이름 : %s\n", 사람1.이름); 
    System.out.printf("나이 : %d\n", 사람1.나이); 

    사람 사람2 = new 사람("김영희", 33); 
    System.out.println("==사람1 정보=="); 
    System.out.printf("이름 : %s\n", 사람2.이름); 
    System.out.printf("나이 : %d\n", 사람2.나이); 
    } 
 } 
 class 사람{ 
     String 이름; 
    int 나이; 
    사람 (String 이름, int 나이) { //매개변수 //생성자 new가 나올 때 바로 작동함. 
        this.이름 = 이름; 
        this.나이 = 나이; 
        } 
}

이렇게 생성자 까지 배운 뒤에 Article을 클래스로 만들어서 설명하기 시작했다. 아마 내일이나 금요일부터는 게시판 구현하기를 슬슬 시작하지 않을까 싶다. Article을 예로 들면서 static에 대해서도 알려주셨다.

  • 예제코드
class Main2 {
    public static void main(String[] args) {
        Article article1 = new Article();
        System.out.println(article1.id);
        Article article2 = new Article();
        System.out.println(article2.id);
    }
}

class Article {
    static int lastId; //스태틱 변수는 공공재다.

    int id;
    String regDate;

    static {
        lastId = 0;
    }

    Article() {
        lastId++;
        this.id = lastId;
    }

    Article(int id, String regDate) {
        this.id = id;
        this.regDate = regDate;
    }
}

대충 이런 코드였는데 static 변수는 공공재라는 말을 배웠다.

  • static
    스태틱은 클래스에 고정되어 있는 변수나 메서드다.
    스태틱 메서드 안에서는 인스턴스 변수를 사용할 수 없다.
    스태틱은 객체생성 없이 사용할 수 없다.

이렇다고 한다. 오늘은 숙제나 필수영상같은게 없었다. 내가 정리를 잘 못해서 그렇지 생각보다 많은 개념을 배웠고 이개념들을 좀 톺아보며 찬찬히 이해할 시간이 필요할 것 같다. 말을 덧붙여보자면 감각적으로는 이해가 되는데 상세한 설명이나 제대로 된 이해는 아직 안되는 것 같다. 그럼 뭐다? 이해하지 못했다는 것이다. 따라서 오늘은 이걸 좀 계속 볼 예정이다.