## 한줄 요약 자바에서 Frame을 공부하다가 접근제어자 부분에서 이해가 되지 않아 질문합니다. ## Frame의 setTitle() 상속 관련 문제 Q. 분명 라이브러리에서 Frame클레스의 메소드 setTitle은 public으로 설정되어 있어상속받지 않고 이를 사용할려고 하다가 에러가 발생해서 질문합니다. 만약 상속을 받아서 사용할려고 하면 문제가 없이 사용이 됩니다. 어떤 개념을 잘못이해하고 있는지 질문남깁니다. ## 레퍼런스 변수 사용과 미사용의 차이 Q.추가적으로 인스턴스를 변수에 집어넣어 계속 사용하는 경우와는 다르게 변수에 집어넣지 않고 바로 인스턴스를 사용하는 경우가 있는데(아래와 같이) 이런 경우 전자와 차이가 있나요? 단순히 main에서 변수가 없기 때문에 일회성으로 사용할 수 밖에 없을 것 같은데 맞나요? ``` package jframe_1; import java.awt.Frame; public class FrameDemo { public static void main(String[] args) { new Test_Frame(); } } class Test_Frame // extends Frame { public Test_Frame() { setTitle("Dynamic Beat"); setSize(1000, 500); setVisible(true); } } ```
## public과 상속 아래의 코드는 동작되지 않습니다. 왜냐하면 `setTitle()` 등의 메소드를 찾을 수 없기 때문입니다. ``` class Test_Frame { public Test_Frame() { setTitle("Dynamic Beat"); // setTitle() 메소드가 Test_Frame 내부에 정의되어있지 않음. setSize(1000, 500); // setSize() 메소드가 Test_Frame 내부에 정의되어있지 않음. setVisible(true); // setVisible() 메소드가 Test_Frame 내부에 정의되어있지 않음. } } ``` ## 상속을 통한 메소드 구현 위 문제를 해결하기 위해서 상속을 사용할 수 있습니다. Frame을 상속받으면 Test_Frame은 Frame 객체를 부모로 갖게됩니다. 따라서 내부적으로 `setTitle()` 등의 메소드를 사용할 수 있게 됩니다. ``` class Test_Frame extends Frame { public Test_Frame() { setTitle("Dynamic Beat"); // this.setTitle()이 호출 <- super.setTitle()을 오버라이딩 setSize(1000, 500); // this.setSize()가 호출 됨. <- super.setSize()를 오버라이딩 setVisible(true); // this.setVisible()이 호출 됨. <- super.setVisible()을 오버라이딩 } } ``` ## 레퍼런스 변수의 유무 객체를 만들고 다시 사용하려면 레퍼런스를 두는 것이 좋습니다. 허나 일회성의 사용일경우 궂이 레퍼런스 변수를 사용할 필요가 없습니다. ``` // 레퍼런스 변수를 통한 메소드 호출 Frame f = new Frame(); f.setTitle("..."); // 객체 생성과 동시에 메소드 호출 new Frame().setTitle("..."); ```