내부 클래스란? 내부 클래스는 클래스 내에 선언된 클래스이다. 내부 클래스로 선언하면 두 클래스의 멤버든 간의 서로 쉽게 접근할 수 있다는 장점과 외부에는 불필요한 클래스를 감춤으로써 코드의 복잡성을 낮출 수 있다는 장점(캡슐화)이 있다. 내부 클래스는 외부 클래스를 제외하고는 다른 클래스에서 사용되지 않는 것이어야 한다. class A { ... class B { ... } } 내부 클래스의 종류와 특징 내부 클래스의 종류는 선언위치에 따른 변수의 종류와 같다. 내부 클래스의 선언 class Outer { class InstanceInner {} // 인스턴스 내부 클래스 static class StaticInner {} // 스태틱 내부 클래스 void method() { class LocalInne..
인터페이스란? 인터페이스는 일종의 추상클래스(abstract class)이다. 추상클래스(abstract class)는 일반 메서드도 포함할 수 있지만 인터페이스는 오직 추상메서드와 상수만을 멤버로 가실 수 있다. 추상클래스(abstract class)는 부분적으로 완성된 미완성 설계도라고 한다면, 인터페이스는 밑그림만 그려져 있는 기본 설계도라고 생각하면 된다. 인터페이스 자체만으로 사용되기 보다는 다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다. 인터페이스 제약사항 모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다. 모든 메서드는 public abstract 이어야 하며, 이를 생략 할 수 있다. 단, static 메서드와 디폴트 메서드는 예외 (JDK1.8..
추상클래스란? 클래스를 설계도에 비유한다면, 추상클래스는 미완성 설계도에 비유할 수 있다. 미완성이라는 것은 멤버의 개수에 관계된 것이 아니라 미완성 메서드(추상 메서드)를 포함하고 있다는 의미다. 추상클래스는 상속을 통해 자손클래스에 의해서만 완성할 수 있다. 추상클래스는 추상메서드를 포함하고 있다는 것을 제외하고는 일반클래스와 다르지 않다. 추상클래스를 상속받은 자손클래스에서는 추상클래스에서 선언된 추상메서드를 모두 구현해야 한다. 만약 하나라도 구현하지 않았을 경우 자손클래스도 동일한 추상클래스로 선언되어야 한다. abstract class Car { // 추상 클래스 boolean enginePower; String engineMode; abstract void engineOnOff(); abst..
다형성이란? 여러 가지 형태를 가질 수 있는 능력을 의미하며, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있다. 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 한다. class Car { String brand; String engine; int door; ... } class SportCar extends Car { SportCar(String brand, int door) { super(brand, "sport", door); } } Car car = new SportCar("Kia", 4); // 조상클래스 타입의 참조변수로 자손클래스 인스..
static - 클래스의, 공통적인 인스턴스변수는 하나의 클래스로부터 생성되었더라도 각기 다른 값을 유지하지만, 클래스변수(static멤버변수)는 모든 인스턴스가 공유하기 때문에 같은 값을 갖는다. static은 붙은 멤버변수와 메서드, 초기화 블럭은 인스턴스가 아닌 클래스에 관계된 것이기 때문에 인스턴스를 생성하지 않고도 사용할 수 있다. 인스턴스 메서드와 static 메서드의 근본적인 차이는 메서드 내에서 인스턴스 멤버를 사용하는가의 여부에 있다. 사용될 수 있는곳 : 메서드, 멤버변수, 초기화 블럭 final - 마지막의, 변경될 수 없는 변수에 사용되면 값을 변경할 수 없는 상수가 되며, 메서드에 사용되면 오버라이딩(overriding)을 할 수 없게 되고, 클래스에 사용되면 자신을 확장하는 자손..
접근 제어자(access modifier) 멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역활 접근 제어자가 지정되어 있지 않다면, 접근 제어자가 default이다. 사용될 수 있는곳 : 클래스, 멤버변수, 메서드, 생성자 public 접근 제한이 전혀 없다. protected 같은 패키지 내에서, 다른 패키지의 자손클래스에서 접근 가능 default 같은 패키지 내에서만 접근 가능 private 같은 클래스 내에서만 접근 가능 접근 제어자를 이용한 캡슐화 접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위해서이다. 데이터가 유효한 값을 유지하도록, 또는 비밀번호와 같은 데이터를 위부에서 함부로 변경하지 못하도록 하기 위해서는 외부로..
오버라이딩이란? 조상 클래스로부터 상속(inheritance)받은 메서드의 내용을 변경하는 것 상속(inheritance)받은 메서드를 그래도 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야하는 경우가 많다. class Point { int x; int y; String getLocation() { return x + "," + y; } } class Point3D extends Point { int z; String getLocation() { // 오버라이딩 return x + "," + y + "," + z; } } 오버라이딩의 조건 오버라이딩은 메서드의 내용만을 새로 작성하는 것이므로 메서드의 선언부는 조상의 것과 완전히 일치해야 한다. 메서드의 선언부는 조상의 것과 완전히 일치해야 한다. ..
상속의 정의와 장점 상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 코드를 공통적으로 사용하는 클래스를 상속받게 되면 적은 양의 코드로 클래스를 작성할 수 있고 , 코드를 공통적으로 관리할 수 있어 코드의 재사용성과 중복을 제거 할 수 있다. 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 extends 와 함께 써주기만 하면 된다. 상속해주는 클래스를 조상 클래스(부모 클래스, 상위 클래스, 기반 클래스)라고 하며, 상속받는 클래스는 자손 클래스(자식 클래스, 하위 클래스, 파생된 클래스)라고 한다. class Child extends Parent { ... } 조상 클래스와 자손 클래스의 관계 상속받은 자손 클래스는 상속해준 조상 클래스를 포함하고 있다..
변수의 초기화란? 변수를 선언하고 처음으로 값을 저장하는 것 경우에 따라서 필수적이기도 하고 선택적이기도 하지만, 가능하면 선언과 동시에 적절한 값으로 초기화 하는 것이 바람직하다. 멤버 변수는 초기화를 하지 않아도 변수의 자료형에 맞는 기본값으로 초기화 된다. 하지만 지역변수는 사용하기 전에 반드시 초기화 해야한다. class InitTest { int x; // 인스턴스 변수 int y = x; // 인스턴스 변수 void method() { int i; // 지역변수 int j = i; // 에러 발생. 지역변수를 초기화 하지않고 사용 } } 명시적 초기화(explicit initialization) 변수를 선언과 동시에 초기화하는 것을 명시적 초기화라고 한다. 여러 초기화 방법 중에서 가장 우선적..
재귀호출(recursive call)이란? 메서드의 내부에서 메서드 자신을 다시 호출하는 것 재귀호출을 하는 메서드를 재귀 메서드라 한다. 무한히 자기 자신을 호출하기 때문에 무한 반목에 빠질 수 있어 조건문이 필수적으로 따라다닌다. void method() { // 재귀 메서드 if (n == 0) return; System.out.println(n); method(--n); // 재귀 호출 // while(n != 0) { //System.out.println(--n); // } } 재귀호출을 왜 사용하는가? 일반적인 반복문보다 재귀호출을 사용할 경우 수행시간이 더 오래 걸린다. 하지만 재귀호출이 주는 논리적 간결함 때문에 몇 겹의 반복문과 조건문 으로 복잡하게 작성된 코드가 재귀호출로 작성하면 보다..