Java

상속과 생성자

편리함을 위해서 어떠한 기능을 수용하면 그 기능이 기존의 체계와 관계하면서 다양한 문제를 발생시킨다. 그 문제를 한마디로 줄여서 말하면 복잡도의 증가라고 할 수 있다. 이번 시간에는 생성자가 상속을 만나면서 발생한 복잡성을 보여줄 생각이다. 그 맥락에서 super이라는 키워드의 의미도 중요하게 다뤄질 내용이다. 

이번 수업을 이해하기 위해서는 기본 생성자의 성질에 대한 이해가 선행되야 한다. 아래의 예제를 보자.

package org.opentutorials.javatutorials.Inheritance.example4;
public class ConstructorDemo {
	public static void main(String[] args) {
		ConstructorDemo  c = new ConstructorDemo();
	}
}

위의 예제는 에러를 발생시키지 않는다. ConstructorDemo 객체를 생성할 때 자동으로 생성자를 만들어주기 때문이다. 하지만 아래의 예제는 에러가 발생한다.

package org.opentutorials.javatutorials.Inheritance.example4;
public class ConstructorDemo {
    public ConstructorDemo(int param1) {}
	public static void main(String[] args) {
		ConstructorDemo  c = new ConstructorDemo();
	}
}

매개변수가 있는 생성자가 있을 때는 자동으로 기본 생성자를 만들어주지 않는다. 따라서 위의 예제는 존재하지 않는 생성자를 호출하고 있다. 이 문제를 해결하기 위해서는 아래와 같이 기본 생성자를 추가해줘야 한다.

package org.opentutorials.javatutorials.Inheritance.example4;
public class ConstructorDemo {
    public ConstructorDemo(){}
	public ConstructorDemo(int param1) {}
	public static void main(String[] args) {
		ConstructorDemo  c = new ConstructorDemo();
	}
}

이제 본론으로 들어가보자. 상속 토픽의 첫 번째 예제를 조금 수정해서 생성자를 통해서 left, right의 값을 설정한다.

package org.opentutorials.javatutorials.Inheritance.example2;

class Calculator {
    int left, right;

	public void setOprands(int left, int right) {
		this.left = left;
		this.right = right;
	}

	public void sum() {
		System.out.println(this.left + this.right);
	}

	public void avg() {
		System.out.println((this.left + this.right) / 2);
	}
}

class SubstractionableCalculator extends Calculator {
	public SubstractionableCalculator(int left, int right) {
		this.left = left;
		this.right = right;
	}

	public void substract() {
		System.out.println(this.left - this.right);
	}
}

public class CalculatorConstructorDemo4 {
	public static void main(String[] args) {
		SubstractionableCalculator c1 = new SubstractionableCalculator(10, 20);
		c1.sum();
		c1.avg();
		c1.substract();
	}
}

이해를 돕기 위해서 아래와 같이 차이점만을 부각한 이미지를 첨부하였다. 붉은색으로 표시된 부분이 달라진 부분이다.

실행결과는 아래와 같다.
30
15
-10

SubstractionableCalculator의 생성자로 left와 right의 값을 받아서 초기화시키고 있다. 만약 클래스 Calculator가 메소드 setOprands가 아니라 생성자를 통해서 left, right 값을 설정하도록 하고 싶다면 아래와 같이 코드를 변경해야 할 것이다.

package org.opentutorials.javatutorials.Inheritance.example3;

class Calculator {
    int left, right;
	
	public Calculator(int left, int right){
		this.left = left;
		this.right = right;
	}
	
	public void setOprands(int left, int right) {
		this.left = left;
		this.right = right;
	}

	public void sum() {
		System.out.println(this.left + this.right);
	}

	public void avg() {
		System.out.println((this.left + this.right) / 2);
	}
}

class SubstractionableCalculator extends Calculator {
	public SubstractionableCalculator(int left, int right) {
		this.left = left;
		this.right = right;
	}

	public void substract() {
		System.out.println(this.left - this.right);
	}
}

public class CalculatorConstructorDemo5 {
	public static void main(String[] args) {
		SubstractionableCalculator c1 = new SubstractionableCalculator(10, 20);
		c1.sum();
		c1.avg();
		c1.substract();
	}
}

달라진 부분은 아래와 같다.

위의 코드를 실행하면 오류가 발생한다. 오류의 내용은 아래와 같다.

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    Implicit super constructor Calculator() is undefined. Must explicitly invoke another constructor

	at org.opentutorials.javatutorials.Inheritance.example3.SubstractionableCalculator.<init>(CalculatorConstructorDemo5.java:26)
	at org.opentutorials.javatutorials.Inheritance.example3.CalculatorConstructorDemo5.main(CalculatorConstructorDemo5.java:38)

즉 상위 클래스인 Calculator의 생성자가 존재하지 않는다는 의미다. 하위 클래스가 호출될 때 자동으로 상위 클래스의 기본 생성자를 호출하게 된다. 그런데 상위 클래스에 매개변수가 있는 생성자가 있다면 자바는 자동으로 상위 클래스의 기본 생성자를 만들어주지 않는다. 따라서 존재하지 않는 생성자를 호출하게 되기 때문에 에러가 발생했다. 이 문제를 해결하기 위해서는 아래와 같이 상위 클래스에 기본 생성자를 추가하면 된다.

package org.opentutorials.javatutorials.Inheritance.example3;

class Calculator {
    int left, right;
	
	public Calculator(){
		
	}
	
	public Calculator(int left, int right){
		this.left = left;
		this.right = right;
	}
	
	public void setOprands(int left, int right) {
		this.left = left;
		this.right = right;
	}

	public void sum() {
		System.out.println(this.left + this.right);
	}

	public void avg() {
		System.out.println((this.left + this.right) / 2);
	}
}
class SubstractionableCalculator extends Calculator {
	public SubstractionableCalculator(int left, int right) {
		this.left = left;
		this.right = right;
	}

	public void substract() {
		System.out.println(this.left - this.right);
	}
}

public class CalculatorConstructorDemo5 {
	public static void main(String[] args) {
		SubstractionableCalculator c1 = new SubstractionableCalculator(10, 20);
		c1.sum();
		c1.avg();
		c1.substract();
	}
}

차이점은 아래와 같다.

그런데 상위 클래스인 Calculator에는 left와 right 값을 초기화할 수 있는 좋은 생성자가 이미 존재한다. 이것을 사용한다면 하위 클래스에서 left와 right의 값을 직접 설정하는 불필요한 절차를 생략할 수 있을 것이다. 어떻게 하면 상위 클래스의 생성자를 호출할 수 있을까?

super

super는 상위 클래스를 가리키는 키워드다. 예제를 통해서 super의 사용법을 알아보자.

package org.opentutorials.javatutorials.Inheritance.example3;

class Calculator {
    int left, right;
	
	public Calculator(){}
	
	public Calculator(int left, int right){
		this.left = left;
		this.right = right;
	}
	
	public void setOprands(int left, int right) {
		this.left = left;
		this.right = right;
	}

	public void sum() {
		System.out.println(this.left + this.right);
	}

	public void avg() {
		System.out.println((this.left + this.right) / 2);
	}
}
class SubstractionableCalculator extends Calculator {
	public SubstractionableCalculator(int left, int right) {
		super(left, right);
	}

	public void substract() {
		System.out.println(this.left - this.right);
	}
}

public class CalculatorConstructorDemo5 {
	public static void main(String[] args) {
		SubstractionableCalculator c1 = new SubstractionableCalculator(10, 20);
		c1.sum();
		c1.avg();
		c1.substract();
	}
}

차이점은 아래와 같다.

super 키워드는 부모 클래스를 의미한다. 여기에 ()붙이면 부모 클래스의 생성자를 의미하게 된다. 이렇게 하면 부모 클래스의 기본 생성자가 없어져도 오류가 발생하지 않는다.

하위 클래스의 생성자에서 super를 사용할 때 주의할 점은 super가 가장 먼저 나타나야 한다는 점이다. 즉 부모가 초기화되기 전에 자식이 초기화되는 일을 방지하기 위한 정책이라고 생각하자.

댓글

댓글 본문
작성자
비밀번호
  1. jimin_park(by.herO)
    아래 제 설명을 결론으로 도출시켜 보자면
    자식 클래스의 기본 생성자는 어떻게 될까요?

    public subclass(){

    super(){}

    }

    아마 이렇게 되있겠죠 ? 이걸 머리로써 이해하신다면 이번 수업은 전부 이해하신겁니다.
    대화보기
    • jimin_park(by.herO)
      어쩌면 자바에서 가장 어려운 개념이 바로 이 개념이 아닐까 사료됩니다.
      제가 아는 선에서 여러분들이 의아해 하시는 사항을 논리적으로 알려드릴까 합니다.
      자식클래스 SubstractionableCalculator로 객체(인스턴스)를 생성할 때
      자기자신 SubstractionableCalculator의 생성자를 이용하게되고 이 생성자안에
      부모클래스Calculator의 생성자가 암시적(implicit)으로 설정되어있어
      부모클래스의 인스턴스 변수를 초기화 해줍니다. 그것이 super(); 이고
      부모클래스에 default constructor(기본 생성자)가 없다면 그래서 에러가 발생 하는 것이죠.
      하지만 자식클래스 생성자안에 Super(parameter)를 따로 적어주면 부모클래스의 생성자를 호출할 때
      기본생성자가 아닌 Super(parameter)생성자로 부모클래스 인스턴스 변수를 초기화하게 되고
      그렇기 떄문에 부모클래스에 default생성자가 명시되어있지 않아도 에러가 발생하지 않는 것이죠.

      *설명이 장황한데 요점만 발췌한다면, 자식클래스로 객체를 생성할 떄 자식클래스 생성자를 통해
      객체가 생성이 되는데 이 생성자안에 부모클래스의 생성자가 묵시적 혹은 명시적으로
      선언되어 부모클래스의 인스턴스 변수들을 초기화하고
      그 나머지 자식클래스만이 가지는 인스턴스 변수들을 초기화 해준다 입니다.
      어찌보면 클래스라는 설계도 2개로 하나의 객체를 만들기 때문에 발생하는 복잡성이죠
    • 문의 드립니다.
      생성자와 초기화를 보면

      public Calculator(int left, int right) {
      this.left = left;
      this.right = right;
      }
      위 처럼 선언 후엔 왜 생성자가 없어도 되죠?

      상속과 생성저2를 보면
      public Calculator(int left, int right){
      this.left = left;
      this.right = right;
      }
      한 후 생성자가 없어서 오류가 발생하는데..

      두개는 동일한데.. 상속에서는 생성자가 있어야 하고,
      지금은 생성자가 없어도 된단 말씀인가요?

      약간 헤깔리네요.. 조언좀 부탁 드리겠습니다.
    • Bono Choi
      그렇게 사용될 수도 있다는 점을 들어주신거 같습니다. 맥락상 필요가 없다면 사용하지 않아도 되지만 저경우 example2에서 부모에서 정의내린 인자를 example3에서는 굳이 또 다시 정의 내릴 필요가 없으니 부모클래스의 생성자를 가져다 활용하는 거라 생각이 드네요.
      대화보기
      • 안녕하세요! 강의열심히 듣고 있는 학생입니다!
        궁금한부분이 있어 질문드려요
        package org.opentutorials.javatutorials.Inheritance.example2;
        package org.opentutorials.javatutorials.Inheritance.example3;
        두 예제 모두 setOprands 메소드는 사용하지않고있잖아요?

        근데 example2 의 코딩만으로도 잘 구현되는데
        example3에서 굳이 calculator 상위클래스에 생성자를 부여하는 이유는 뭐죠?
      • 감사합니다!!
      • joo0914krs
        감사합니다
      • 사토우하루
        super 은 클래스명 extends 뒤에 붙는 상속자 즉, 바로 위의 상속자를 말합니다.
        대화보기
        • JustStudy
          고맙습니다
        • 강의잘듣고있습니다.
          무쿵현따
          대화보기
          • 하얀달
            꼭 그런것은 아닙니다. 저번강의 상속 강의와 같이 보면 이해가 조금 편하실텐데,

            기본생성자가 필요한 이유는 상위클래스(상속을주는)의 생성자가 public Calculator(int left,int right) 와 같이
            생성 되었을때에,

            하위클래스(상속을받는)의 생성자에서 하위클래스 본인의 생성자 ..
            즉, SubstractionableCalculator(int left, int right) 를 생성 했을때에 상위클래스에 기본생성자가 없으면 오류가
            납니다. 직접실행해보시면 오류가 난다는 것을 아실거에요.

            오류가 나는 이유는 상위클래스를 상속받았는데, 상위클래스에는 이미 생성자가 있다.

            그런데, 그 생성자는 역할이 있죠, left , right 값을 받는 .. 그런데, 그 역할을 하지 못하니 오류가 나버립니다.
            (어디까지나 예를 든 것 이니 ㅎㅎ 가볍게 들어주세요) ==> 이때 해결방법은 super(left,right)를 하면 됩니다.

            그래서 상위클래스에 기본 생성자 Calculater() { } 를 주면 하위클래스에서 상위클래스에 있는 2개의 생성자중

            기본생성자를 가져오게 되고, 아무런 문제가 없는것이죠. ( 기본생성자는 아무런 값을 받지 않으니까요 ^^)

            이해가 되셨으면 좋겠네요 ~ 저도 한때 헷갈렸었던 부분이라 잘설명을 드리고 싶었으나..

            저도 배우는 입장이다보니 조금은 설명이 부족함을 느낍니다.
            대화보기
            • 김트라슈
              감사합니다
            • 궁금합니다.
              오늘 수업을 봤을때 생긴 의문인데

              상속을 주는 상위 클래스의 경우에는 무조건 기본생성자를 가지고 있어야 되는 건가요?

              public Calculator(int left, int right)와 같은 생성자외에 말이죠
            • 감사합니다 ♡
            • 송이
              궁금한게 있어요
              super는 부모 클래스를 의미한다는데 예를 들어 클래스를 상속에 상속에 상속 받을 경우에, 바로 위에 상속받았던 클래스가 super가 되는건가요? 아니면 상속의 최상위 클래스가 super가 되는건가요
            • 오빠는다르다
              감사합니다!!!
            • 알려자바
              호출시 매개변수 및 인자가 같은게 실행 되겠죠!!
              대화보기
              • 클래스 이름을 좀 짧고 유니크하게 만들어주셨으면 좋겠습니다.
                클래스 이름이 걔가 걔같고, 걔가 걔같아서....그거 구분하느라 개념이 안들어와요.
                감사합니다.^^
              • ctw1048@hanmail.net
                음 한가지 궁금한게 생성자는 객체의 초기값을 잡아주기 위해서 만드느건데 생성자를 2개 만들 수 있다니 좀 놀랍네요.. 그럼 어떤 생성자가 적용되는걸까요?
              • 재미개발
                부엉위 바위에서 운지하고싶다
              • 코딩하기 좋은날
                package is.app;

                public class Card {
                public static final int KIND_MAX = 4;
                public static final int NUM_MAX = 13;

                public static final int SPADE = 4;
                public static final int DIAMOND = 3;
                public static final int HEART = 2;
                public static final int CLOVER = 1;

                int kind;
                int number;

                Card()
                {
                this(SPADE, 1);
                }

                Card(int kind, int number)
                {
                this.kind = kind;
                this.number = number;
                }

                public void CardPick(int kind, int number)
                {
                this.kind = kind;
                this.number = number;
                }

                public String toString(){
                String kind = "";
                String number = "";

                switch(this.kind)
                {
                case SPADE:
                kind = "SPADE";
                break;
                case DIAMOND:
                kind = "DIAMOND";
                break;
                case HEART:
                kind = "HEART";
                break;
                case CLOVER:
                kind = "CLOVER";
                break;
                }

                switch(this.number)
                {
                case 13:
                number = "K";
                break;
                case 12:
                number = "Q";
                break;
                case 11:
                number = "J";
                break;
                default:
                number = this.number + " ";
                }

                return "kind : " + kind + " number : " + number;
                }
                }


                package is.app;
                import is.app.*;
                public class Deck {
                public int CARD_NUMBER = 52;
                Card c[] = new Card[CARD_NUMBER];

                Deck()
                {
                int i, k;

                for(i = 0, k = Card.KIND_MAX; k > 0; k--)
                for(int n = 1; n < Card.NUM_MAX + 1; n++)
                //c[i++].CardPick(k, n);
                c[i++] = new Card(k, n); // 질문 (이렇게 하면 두번 object을 생성 하는 것이 아닌가요?????????

                }

                }
              • googler
                class SubstractionableCalculator extends Calculator 이부분에서 Calculator 부분이 클래스이고. 무조건 이 클래스의 기본Calculator() 호출하는건가요??

                그리고2/2 동영상 바로아래 예제를 ideone.com 에서 돌려보니
                error: class CalculatorConstructorDemo4 is public, should be declared in a file named CalculatorConstructorDemo4.java
                public class CalculatorConstructorDemo4 {

                라고 뜨는데 파일에 이름을 정의하라는데 에디터로밖에 못돌리나요..?
              • 박첩구드
                항상 감사합니다~ !!
                super()는 결국 자식 클래스를 인스터스화하려면 부모클래스가 인스터스화 되어야한다는것을 뜻하는 건가요??
              • 10년만에 자바
                저도 돌려보고 안건데
                생성자()정의 생략 -> 메인에서 생성자()로 호출 : OK
                생성자(인자값)만 정의 -> 메인에서 생성자(인자값)으로 호출 : OK : CalculatorDemo1의 경우
                생성자(인자값)만 정의 -> 메인에서 생성자()로 호출 :NG

                즉 기본 생성자만 있으면 자동으로 만들어주나
                기본생성자() 이외의 생성자(인자값)이 있을 경우에는
                기본생성자()도 정의 해주어야 하는 것으로 보입니다.
                대화보기
                • Byunghawk Lee
                  진지한 궁금증입니다.
                  실제 프로그램에서 이런 류의 코딩이 사용되나요?
                  만약 사용이 된다는 어떤 경우에 해당이 될까요?
                  아무튼 잘보고 갑니다. 개념만 이해하고 넘어갑니다.
                • 코코딩
                  Super 예제에서 Calculator 클래스 바로 밑에 기본 생성자가 들어가있는데

                  이 예제는 이게 없어도 된다는걸 보여주기 위한 예제 맞죠?
                • 되게재밌네요 ㅇㅅㅇ
                • 갑사합니다!
                • cocohodu
                  좋은강의 감사합니다
                • 자바초보
                  잘 이해가 안됩니다.. 초기화와 생성자 강의인 CalculatorDemo1의 예제 코드를 보면 public Calculator(int left, int right) 로 인자가 있는데 이러면 기본생성자를 자동으로 만들어주지 않으니 앞에 기본생성자를 적어야 하는거 아닌가요?
                • 자바초보자
                  정말 주옥같은 강의 잘 듣고 있습니다.

                  정말 감사합니다.
                • klrodel
                  강의 잘 보고 있습니다.

                  하위 클래서 생성자에서 반드시 super(left, right); 를 사용해야만 하나요?
                  C++ 에서는 SubstractionableCalculator(int left, int right) : Calculator(left, right) 처럼 사용하잖아요,..
                  자바에서는 Calculator(left, right); <-- 이렇게 부모클래스 이름으로 사용하면 안되는건가요?
                • 김곰
                  전 남잡니다
                  여자목소리를 좋아합니다
                  but egoing님 목소리톤 괜찮아요
                  강의를 4개 보고 들었습니다. 즉 4분이 다다른 목소리톤이나 여러가지로.... 물론 속도도 다릅니다
                  근데 좋네요 뭐 개취이긴 하지만 남자인 제가 들어도 나쁘지 않습니다 부럽네요 목소리...
                  and 오프라인 강의도 하시나요?
                  강남에서 학원을 다니고 있지만 온라인의 또 다른 매력은 반복해서 들을 수 있다는게..
                • Joon Lee
                  이고잉님 목소리톤이 낮고 느려서 졸리다면 유투브 재생속도를 2배로 올려서 들으세요.
                  톤도 높아지고 속도도 빨라져서 덜 졸리고 진도도 빨리 나갈것 같네요.
                  대화보기
                  • 잠꾸러기
                    강좌는 너무 좋습니다.
                    그런데 언제나 피곤해서.... 항상 제가 졸음이 와요.
                    많은 시간이 흘렀지만 진도는 잘 안나가고...
                    강좌는 자장가처럼...
                    오늘 처음 맑은 정신으로 강좌를 듣습니다.
                    감사~ 꾸~벅- -
                  • 그런데 C++처럼 자바도 메소드를 아래와 같이 정의해 놓고 나중에 세부 사항을 정의할 수 있나요?

                    class CppVSJAVA{
                    public void method();
                    public void method(){
                    //세부 사항 정의 내용
                    }
                    }

                    항상 이고잉님이 자바 수업에서 기본 생성자를 정의할때마다 아래와 같이 하시길래요. 세부 사항 정의 내용이 없어도 {}를 써야 되나요?

                    class CppVSJAVA{
                    public void method(){}
                    public void method(){
                    //세부 사항 정의 내용
                    }
                    }
                  • 그냥 패키지 이름을 바꾸는 겁니다.
                    대화보기
                    • 강태산
                      위예제에서 달라진 부분 중에 첫번째줄(package org.opentutorials.javatutorials.......)의 의미는 package을 새로 생성하여 코드를 짠다는 뜻인가요?
                    • egoing
                      암기하실 필요는 전혀 없습니다!
                      그냥 자연스럽게 익숙해질 업계용어들입니다.
                      조금만 인내심을 발휘해주세요 :)
                      대화보기
                      • 초심자
                        강의 너무 좋아요!!

                        그런데 궁금한 점이

                        정리가 안되는 부분이 '용어'인데요

                        어떨때는 명령어 어떨때는 구문 어떨때는 배열 어떨때는 키워드 ... 이런식으로 나오는데

                        그것역시 그대로 단위로서 암기해도 되는 건가요? 아니면

                        이고잉님께서 임의적으로 하시는 건가요!?
                      • 태양의 노래
                        좋은 강의 감사드립니다~
                        JAVA 전문가가 되고 싶습니다~
                      • 아짱
                        아하..이해됫네요
                        감사합니다
                        대화보기
                        • egoing
                          매개변수가 있는 생성자를 구현했을 때는 매개변수가 없는 생성자를 자동으로 만들어주지 않는다는 의미일꺼예요
                          대화보기
                          • 아짱
                            지난번 강의에서는 객체를 생성할때
                            눈에는 보이지않지만 자동으로 생성자가 생성된다고 햇는데
                            이번강의에서는 자바는 생성자를 자동으로 생산되지 않는다고
                            하시니 이런.....멘붕오는데요..ㅜㅜ
                          • 이은호//

                            super(); 이라는 기본 상위생성자를 자동으로 호출하는데 이것이 암시적으로 되어있어서 사용자에게 보이지 않습니다
                            대화보기
                            • 꿈을먹는아이
                              항상 수고하십니다. 이런 사이트가 있는 것에 감사를 표현하면 질문을 올릴려고 합니다.
                              제가 코드를 볼때 순서도(?)처럼 보는데 Super위에 있는 코드의 main method에서

                              (10,20)을 넣게 되면 --> 하위클래스 (10,20) 호출 --> left = 10, right =20 --> this.left & this.right로 대입

                              다음에 순서상으로 상위 클래스로 이동해야 할 차례인데 강의를 들어봐도 왜 기본생성자가 있을때는 하위 클래스의 this.left와 this right를 상위클래스에서 받을수 있고 매개변수가 정의되어 있으면 안되는 지 궁금합니다.

                              적어놓고 보니 아래의 질문과 동일한 질문 같기도 한데 그래서 제가 이해하기로는 자바의 문법에서는 부모 클래스의 생성자(?: 용어가 맞는지 모르겠네요) 를 호출하기 위해서는 기본 생성자가 필요하므로 기본생성자가 없으면 자식클래스에서 부모클래스를 호출할 수 없다라고 이해했습니다. 제가 생각 한 것이 맞는지 궁금합니다.

                              그리고 이어서 하위 클래스의 this.left this.right를 부모클래스가 기본 생성자가 있어서 받을 경우에 이 변수를 누가 받는 건지 궁금합니다.
                            • egoing
                              기본 생성자란 생성자를 정의하지 않았을 때 자바에서 자동으로 만들어주는 생성자 입니다. 이 생성자는 파라미터가 없습니다. 그런데 사용자가 직접 생성자를 정의하면 자바는 기본 생성자를 만들지 않습니다.

                              클래스를 호출할 때 그 클래스가 부모 클래스가 있다면 자바는 부모 클래스의 생성자를 호출하는데 부모 클래스에 생성자가 정의 되어 있다면 기본 클래스는 존재하지 않는 상태이기 때문에 존재하지 않는 생성자를 하위 클래스가 호출하게 되고 오류가 발생한다는 뜻일꺼예요.
                              대화보기
                              • 이은호
                                "하위 클래스가 호출될 때 자동으로 상위 클래스의 기본 생성자를 호출하게 된다. "

                                위의 부분이 좀 이해가 안 가는데요.. 좀 더 자세한 설명 부탁드릴 수 있을까요?
                              • egoing
                                헉 엄청 거대한 오타군요 ㅠㅠ 이건 개편 때까지 수정이 불가능한 오타라서 부끄러운 상태로 남겨두겠습니다. ㅠㅠ

                                디자인 패턴도 수업화하고 싶습니다. 언제가 될지는 기약 할 수 없지만요.
                                대화보기
                                • 부탁드려요
                                  setOprands method <- 일부러 줄임말로 쓰신건지 아닌지 모르겠지만, setOperands 가 맞을꺼고요,

                                  SubstractionableCalculator <- 라고 쓰셨는데, 뺄셈은 Subtract 입니다. 아마 오타이신거같네요.

                                  수업 놓치지않고 잘 따라가고있습니다. 항상 좋은자료 감사드립니다!

                                  p.s) 스레드,멀티스레드, 그리고 자바에서 쓰일 수있는 여러가지 패턴들 관련 수업도 올려주시면 정말 감사하겠습니다. 독학하는데 혼자 이해하려니 힘들더라구요 ㅠㅠ
                                버전 관리
                                egoing
                                현재 버전
                                선택 버전
                                graphittie 자세히 보기