JDK1.2부터 컬렉션 프레임워크가 등장하면서 다양한 종류의 컬렉션 클래스가 추가되고 모든 컬렉션 클래스를 표준화된 방식으로 다룰 수 있도록 체계화되었다. 컬렉션 프레임워크(Collections Framework)는 컬렉션, 다수의 데이터를 다루는 데 필요한 다양하고 풍부한 클래스들을 제공하기 때문에 프로그래머의 짐을 상당히 덜어 주고 있으며, 또한 인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화되어 있기 때문에 사용법을 익히기에도 편리하고 재사용성이 높은 코드를 작성할 수 있다는 장점이 있다. 컬렉션 프레임워크의 핵심 인터페이스 컬렉션 프레임워크에서는 컬렉션 데이터 그룹을 크게 3가지 타입이 존재한다고 인식하고 그 컬렉션을 다루는데 필요한 기능을 가진 3개의 인터페이스를 정의하였다. 인터페이..
Object클래스 equals(Object obj) public boolean equals(Object obj) { return (this==obj); } Object클래스에 정의되어 있는 equals메서드의 실제 내용이다. 위의 코드에서 알 수 있듯이 두 객체의 같고 다름을 참조 변수의 값으로 판단한다. public class Test { public static void main(String[] args) { Value v1 = new Value(10); Value v2 = new Value(10); if (v1.equals(v2)) System.out.println("v1 == v2"); else System.out.println("v1 != v2"); v2 = v1; if(v1.equals(v2)..
프로그램 오류 프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우가 있다. 이러한 결과를 초래하는 원인을 프로그램 에러 또는 오류라고 한다. 에러의 발생 시점에 따라 컴파일 에러와 런타임 에러로 나눌 수 있는데, 컴파일 에러(compile-time error)는 컴파일할 때 발생하는 에러이고 프로그램의 실행 도중에 발생하는 에러를 런타임 에러(runtime error)라고 한다. 소스코드를 컴파일하면 컴파일러가 소스코드(*.java)에 대해 오타나 잘못된 구문, 자료형 체크 등의 기본적인 검사를 수행하여 오류가 있는지 알려 준다. 하지만 컴파일을 에러 없이 성공적으로 마쳤다고 해서 프로그램의 실행 시에도 에러가 발생하지 않는 것은 아니다. 컴파일러가 소스코드의 기본적인 사항..
인터페이스란? 인터페이스란 일종의 추상 클래스이다. 인터페이스는 추상 클래스처럼 추상 메서드를 갖지만 추상 클래스보다 추상화 정도가 높아서 추상 클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버 변수를 가질 수 없다. 오직 추상 메서드와 상수만을 멤버로 가질 수 있다. 추상 클래스를 부분적으로만 완성된 '미완성 설계도'라고 한다면, 인터페이스는 구현된 것은 아무것도 없고 밑그림만 그려져 있는 '기본 설계도'라 할 수 있다. 인터페이스도 추상 클래스처럼 불완전한 것이기 때문에 그 자체만으로 사용되기보다 다른 클래스를 작성하는데 도움 줄 목적으로 작성된다. 인터페이스의 작성 'class' 대신 키워드 'interface'를 이용하여 작성할 수 있다. interface에도 클래스와 같이 접근제어자로 publi..
추상클래스란? 클래스를 설계도에 비유한다면, 추상클래스는 미완성 설계도에 비유할 수 있다. 클래스가 미완성이라는 것은 멤버의 개수에 관계된 것이 아니라, 단지 미완성 메서드(추상 메서드)를 포함하고 있다는 의미이다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상 클래스로 인스턴스는 생성할 수 없다. 추상 클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다. 추상클래스 자체로는 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는 데 있어서 바탕이 되는 조상 클래스로서 중요한 의미를 갖는다. 새로운 클래스를 작성할 때 아무것도 없는 상태에 시작하는 것보다는 완전하지는 못하더라도 어느 정도 틀을 갖춘 상태에서 시작하는 것이 나을 것이다. 문법 추상 클래스는 키워드 'abstract'를 붙..
다형성이란? 객체지향 개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며, 자바에서는 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였다. 요약하면 조상 클래스 타입의 참조 변수로 자손 클래스의 인스턴스를 참조할 수 있다. class Tv { boolean power; int channel; void power() { power = !power; } void channelUp() { ++channel; } void channelDown() { --channel; } } class CaptionTv extends Tv { String text; void caption() { } } 클래스 Tv와 CatptionTv는 서로 상속관계에 있..
제어자란? 제어자(modifier)는 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다. 제어자의 종류는 크게 접근 제어자와 그 외의 제어자로 나눌 수 있다. 접근 제어자 public, protected, default, private 그 외 static, final, abstract, native, transient, synchronized, volatile, strictfp 제어자는 클래스나 멤버 변수와 메서드에 주로 사용되며, 하나의 대상에 대해서 여러 제어자를 조합하여 사용하는 것이 가능하다. 단, 접근 제어자는 하나의 대상에 대해서 하나만 선택해서 사용할 수 있다. static - 클래스의, 공통적인 static은 '클래스의' 또는 '공통적인'의 의미를 가지고 있다. ..
오버라이딩이란? 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다. 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야 하는 경우가 많다. 이럴 때 조상의 메서드를 오버라이딩한다. 오버라이딩의 조건 자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 - 이름이 같아야 한다. - 매개변수가 같아야 한다. - 반환 타입이 같아야 한다. 요약하면 선언부가 서로 일치해야 한다. 다만 접근 제어자와 예외는 제한된 조건 하에서만 다르게 변경할 수 있다. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다. 만약 조상 클래스에 정의된 메서드의 접근 제어자가 protected라면, 이를 오버라이딩하는 자손 클래스의 메서드는 접근 제어자가..
상속의 정의와 장점 상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 유리하다. 이러한 특징은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다. 상속 구현 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 'extends'와 써주면 된다. class Child extends Parent { // ... } 이 두 클래스는 서로 상속 관계에 있다고 하며, 상속해주는 클래스를 '조상(or 부모, 상위, 기반) 클래스'라 하고 상속받는 클래스를 '자손(or 자..
같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 아래 조건을 만족하면 생성자 간에도 서로 호출이 가능하다. - 생성자의 이름으로 클래스 이름 대신 this를 사용한다. - 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다. 아래 코드는 위의 두 조건을 만족시키지 못했기 때문에 에러가 발생한다. class Car { String color; int door; String gearType; Car(String color) { door = 5; Car(color, "auto", 4); } } 에러가 발생한 이유. 생성자 내에서 다른 생성자를 호출할 때 this를 사용하지 않음. 두 번째 줄에서 생성자 호출. this(color, "auto", 4)로 해야 한다. 생성자에서 다..
오버로딩이란? 자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다. 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩' 또는 '오버로딩(overloading)'이라 한다. 보통 하나의 메서드 이름에 하나의 기능만을 구현해야 하는데, 여러 기능을 구현하기 때문에 붙여진 이름이다. 오버로딩의 조건 메서드의 이름이 같아야 한다. 매개 변수의 개수 또는 타입이 달라야 한다. 위의 조건을 만족시키지 못하는 메서드는 중복 정의로 간주되어 컴파일 시에 에러가 발생한다. 오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영..
메서드 앞에 static이 붙어 있으면 클래스 메서드이다. 클래스 메서드도 클래스 변수처럼, 객체를 생성하지 않고도 '클래스이름.메서드이름(매개변수)'와 같은 식으로 호출이 가능하다. 반면에 인스턴스 메서드는 반드시 객체를 생성해야만 호출할 수 있다. static 메서드는 언제 사용할까? 클래스는 '데이터(변수)와 데이터에 관련된 메서드의 집합'이므로, 같은 클래스 내에 있는 메서드와 멤버 변수는 아주 밀접한 관계가 있다. 인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드이다. 반면에 메서드 중에서 인스턴스와 관계없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드를 클래스 메서드(static 메서드)로 정의한다. 클래스를 ..