본문 바로가기

Study/Java

(12)
[Java] 내부 클래스 내부 클래스는 사실 사용빈도가 그렇게 높지 않다고 한다. 하지만 알아놓는 것만으로도 필요한 순간이 있을 때 떠올릴 수 있기 때문에, 정리해 놓으려 한다. 주로 AWT나 Swing과 같은 GUI 어플리케이션의 이벤터 처리에 사용된다. 내부 클래스란? class A { ... class B { ... } ... } 클래스 내에 선언된 클래스이다. 클래스 내부에 선언된 다는 점을 빼면 지금까지 배워온 클래스와 큰 차이가 없다. 클래스 간의 서로 긴밀한 관계가 있는 경우 내부 클래스를 사용한다. 그렇다면 왜 굳이 내부에 선언을 하는 것일까? 바로 클래스 간의 접근성 향상 때문이다. 서로 쉽게 접근함과 동시에 외부에 굳이 노출시킬 필요 없는 클래스를 감춰 코드를 보기 편하게 해 준다. 정리하자면 다음과 같다. 내..
[Java] 추상클래스 추상클래스 추상클래스는 미완성 설계도이다. 미완성 메소드를 포함하고 있다는 의미이며, 자손클래스에 의해서만 완성될 수 있다. 새로운 클래스를 작성할 때 어느정도 틀을 갖춘 상태에서 시작할 수 있다는 편리함이있다. abstract 제어자를 사용하면 된다. 추상메소드 메소드는 선언부와 구현부로 구성되어있는데, 추상메소드는 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨두는 것이다. abstract를 이용해 메소드를 정의하는 이유는, 해당 제어자를 붙이면 자손클래스를 작성할 때 무조건 오버라이딩을 해야하기 때문이다. 추상클래스 설계 시 필수적으로 구현해야하는 메소드의 경우 추상메소드를 사용해주도록하자. public abstract class Car { public String color; public ab..
[Java] 다형성 다형성 조상 클래스 타입의 참조 변수로 자손 클래스의 인스턴스를 참조할 수 있다. Tv클래스와 이를 상속받는 CaptionTv클래스가 존재한다고 가정하자. CaptionTv cap1 = new CaptionTv(); Tv cap2 = new CaptionTv(); // 자손 인스턴스를 부모 클래스 참조변수에 할당하였다 둘의 차이점은, cap1의 경우 CaptionTv클래스의 모든 변수와 메소드를 사용할 수 있지만, Tv 참조 변수에 담긴 cap2는 Tv클래스에 담긴 변수와 메소드만 사용할 수 있다. 이러한 다형성은, 매개변수로 클래스의 타입을 넘겨줄 때와 배열을 생성할 때 유용하게 사용된다. 참조변수가 사용 가능한 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 하므로, 반대의 경우는 사용할 수 없..
[Java] 자바의 제어자 제어자 자바에는 다양한 제어자가 있다. 처음 배울 땐 그렇구나 하고 넘어가는데, 다 배우고 나니 추상, final, 접근 제어자 등.. 헷갈리기 시작한다. 익숙해지면 헷갈리지 않겠지만 자바에만 시간을 쏟는 게 아니다 보니 다른 언어를 하다 보면 까먹게 될 것 같아서 정리해본다. 우선 접근제어 자부터 살펴보자. 접근제어자 접근제어자에는 public과 private만이 있는 게 아니다! 제어자 이름 같은 클래스 같은 패키지 자손 클래스 모두 public O O O O protected O O O default O O private O 까먹을 것 같을 때 종종 보도록 하자. protected의 경우 자손클래스 까지만 접근이 가능하다는 것과, 접근제어자를 붙이지 않은 default의 경우 같은 클래스와 같은 패..
[Java] 패키지와 import Package와 Import 패키지 관련된 클래스들을 관리하기 위해 묶어 놓은 것이다. 클래스의 이름이 같아도 다른 패키지에 속하면 패키지 명으로 구분이 가능하므로 충돌을 피할 수 있다. 클래스가 하나의 ".class" 파일인 것과 같이 패키지는 하나의 물리적인 디렉토리이다. 소스 파일의 첫 번째 줄에 선언되어야 하며 모든 클래스는 하나의 패키지에 속해야 한다. 클래스와의 혼동을 막기 위해 패키지는 소문자로 이름을 짓는 것이 일반적이다. 패키지도 다른 패키지를 포함하는 게 가능하며 "."으로 구분된다. 소스파일 작성 시 패키지 선언을 하지 않을 경우 자동으로 unamed package에 속하게 된다. 패키지를 생성한 뒤에는 패키지 루트 디렉토리를 클래스 패스에 포함시키는 것을 잊지 말자! import 문..
[Java] 오버라이딩 오버라이딩 자바 질문 중에 단골로 나오는 오버로딩과 오버라이딩.. 오버라이딩은 저번에 공부를 했으니 오버라이딩을 공부해보았다. 기억하기 쉽게 오버로딩과 오버라이딩의 차이도 적어놨다. 그리고 상속에서 다루지 못한 super가 책에 함께 언급되어 같이 적어보았다. 이 두 개밖에 없어서 오늘의 공부 필기는 다른 포스팅에 비해 분량이 적을 것 같다. 오버라이딩은 상속받은 메소드의 내용을 변경하는 것이다. 부모 클래스에 존재하던 메소드가 현재 클래스에 맞지 않는 경우 재정의가 가능하다. 오버라이딩은 메소드의 내용만 새로 작성하는 것으로 조건이 몇 가지 존재하는데, 선언부(이름, 매개변수, 리턴 타입)가 같아야 한다. 접근 제어자(public, private 등)를 좁은 범위로 변경할 수 없다. 메소드의 인스턴스와..
[Java] 자바의 상속 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 자손이 되는 클래스는 부모 클래스의 모든 멤버를 상속받는다. 자손 클래스는 조상 클래스의 모든 멤버를 상속받으므로 항상 조상 클래스보다 같거나 많은 멤버를 갖는다. 상속의 상속을 거듭할수록 멤버 개수는 늘어난다. 생성자와 초기화 블럭은 상속되지 않는다. 상속을 통해 코드를 한 곳에서 관리함으로써 코드의 중복을 줄일 수 있다. 포함관계 및 관계설정 클래스의 멤버 변수로 다른 클래스 타입의 참조 변수를 선언하는 것이다. 다른 클래스 타입의 참조 변수를 멤버로 사용하는 것일 뿐, 내부에 클래스를 새로 정의한 것은 아니기 때문에 내부 클래스와는 다르다! class Circle { int point = new Point(); // Point 클래스를 포..
[Java] 변수의 초기화 멤버 변수의 경우 자동적으로 변수의 자료형에 맞는 값으로 초기화되지만, 지역 변수는 반드시 사용하기 전에 초기화 해주어야 한다. 멤버 변수라도 적절한 값으로 초기화해주는 것을 권장한다. 초기화 방법 명시적 초기화 변수 선언과 동시에 초기화 하는 것이다. 예시 ⇒ int door = 4; 생성자 초기화 블럭 복잡하거나 생성자들의 중복 코드를 제거하기 위해 사용한다. 클래스 초기화 블럭 인스턴스 초기화 블럭 class Test{ static { 클래스 초기화 } // 메모리 로딩 될 때 단 한번 실행 { 인스턴스 초기화 } // 인스턴스 생성시 실행. 생성자보다 먼저 실행된다. } 초기화 시기와 순서 클래스 처음 로딩 시 단 한번 초기화 기본값 ⇒ 명시적 초기화 ⇒ 블럭 인스턴스 인스턴스 생성될 때마다 실행..