클래스(Class)

클래스란 어떤 특정 종류의 모든 객체들에 대해 일반적으로 적용할 수 있는 변수와 메소드를 정의하고 있는 소프트웨어적인 설계도(blueprint) 또는 프로토타입(prototype). 실세계에 존재하는 객체들이 가질 수 있는 상태와 행동들에 대해 소프트웨어적으로 추상화(abstraction)한 것

추상클래스

추상 클래스는 객체가 가지는 특성들을 추상화시켜 놓았을 뿐 아직 구체화 시키지 못한 클래스이므로, 이 추상클래스를 상속하는 하위 클래스에서 좀 더 구체화 시키도록 하는 것입니다. 따라서, 추상클래스를 상위 클래스로 하여 상속하는 하위 클래스는 추상클래스인 상위 클래스에서 완전히 구현하지 못한 부분들을 완전하게 구현해 주어야만 하위 클래스에 대한 객체 생성이 가능하고, 그렇지 못할 경우 하위 클래스는 상위 클래스인 추상 클래스와 같이 미완성이므로 자체적으로 객체를 생성할 수 없고, 이 하위 클래스는 다시 추상 클래스가 됩니다.

추상 메소드의 특징

추상메소드는 추상클래스와 마찬가지로 아직 구현이 이루어지지 않고 단지 그 프로토입만 가지고 있는 메소드.

  1. 추상메소드는 미완성 메소드이어야 하므로, 메소드의 몸체(body)를 가질수 없음
  2. 추상메소드는 클래스가 가져야 할 인터페이스에 대한 프로토타입(메소드의 형태)을 정의하고 있음
  3. 추상메소드는 하위클래스가 가져야 할 인터페이스를 정의
  4. 추상메소드를 포함하는 클래스는 반드시 추상클래스로 선언되어야 함

추상클래스(메소드) 선언 시 주의사항

  1. abstract 메소드를 하나라도 가지고 있다면 그 클래스는 반드시 abstract 클래스로 선언되어야 함
  2. abstract 클래스는 직접 객체를 생성할 수 없음
  3. abstract 클래스를 사용하기 위해서는 이 클래스를 상속한 클래스에서 abstract 메소드를 구현해 주어야만 함
  4. 만약 abstract 클래스를 상속했는 데 abstract 메소드를 구현해 주지 않았다면 이 클래스 역시 abstract 클래스로 선언되어야 함
  5. abstact 한 메소드가 없어도 abstract class로 선언할 수 있음( 상속을 통해서만 접근 가능)

상속(Inheritance)

객체지향 개념은 클래스를 이용하여 다른 클래스를 생성 또는 정의할 수 있습니다. 다시 말해서, 하위클래스는 상위클래스가 갖고 있는 모든 특성들을 상속하여 사용할 수 있습니다. 이러한 상속 관계를 트리로 나타낼 수 있고, 이 상속관계 트리를 클래스 계층도(class hierarchy)라 합니다. 상속의 장점을 살펴보면, 상위클래스는 하위클래스들이 가질 수 있는 일반적인 상태와 행동을 정의하고 있고, 하위클래스는 하위클래스 만이 갖는 특별한 상태와 행동을 정의하도록 함으로써 상위클래스를 여러 하위클래스들이 재사용할 수 있고 소프트웨어 개발에 드는 비용을 감소할 수 있습니다. 프로그램 개발자는 상위클래스를 일반적인 행동(genericbehavior)을 정의하도록 할 수 있고, 이러한 클래스를 추상 클래스(abstract class)라 합니다. 이러한 추상 클래스는 부분적으로 구현되거나 구현이나 정의가 이루어지지 않을 수 있는데, 이는 하위클래스를 정의하면서 완성할 수 있도록 가이드라인을 제공해 주는 역할을 합니다.

인터페이스

추상메소드와 파이널 변수로만 이루어진 클래스. 따라서, 인터페이스 내에 정의된 메소드는 자바에 의해 자동으로 ‘public abstract’로 변수는 자동으로 ‘public static final’로 선언됩니다. 구현이 이루어지지 않은 추상메소드를 포함하고 있는 인터페이스는 객체 생성을 할 수 없습니다. 클래스가 인터페이스를 구현해주어야 상속이 가능합니다. 이 때, 클래스는 인터페이스의 모든 메소드 및 변수들을 상속하게 되며, 인터페이스에 정의되어 있는 모든 메소드를 구현해 주지 않을 경우 이 클래스는 추상메소드를 포함하고 있으므로 추상클래스로 선언되어야 합니다.

다음은 인터페이스의 일반적인 형태입니다.

접근제어자 interface 인터페이스이름 [extends 상위인터페이스] {
   상수선언;
   메소드선언;
}

인터페이스의 용도

  1. 강제적인 클래스 관계를 만들지 않으면서 서로 관련없는 클래스들 상이의 유사성을 나타내야 할 경우 
  2. 하나 이상의 클래스들이 구현하기를 원하는 메소드를 선언할 경우
  3. 클래스를 보여주지 않고서 객체의 프로그래밍 인터페이스를 보여주어야 할 경우

인터페이스와 다중상속의 차이

자바에서 인터페이스가 다중 상속을 할 수 있도록 해준다고 하는데, 인터페이스는 다중 상속을 할 수 있도록 해 주는 것이 아니라 다중 상속을 하는 것처럼 해 주는 것

  1. 클래스는 인터페이스로부터 단지 상수만을 상속
  2. 클래스는 인터페이스로부터 메소드의 구현(몸체)에 대해서는 상속할 수 없음 
  3. 인터페이스의 계층 구조는 클래스의 계층 구조와 서로 무관
    1. 같은 인터페이스를 구현하는 클래스들은 클래스 계층 구조 상에서 서로 관련이 있을 수도 없을 수도 있음. 이러한 특성 때문에 진정한 다중 상속이라 할 수 없음. 그러나 자바에서는 하나의 인터페이스가 여러 개의 상위 인터페이스를 가질 수 있도록 함으로써, 다중 인터페이스 상속을 할 수 있도록 함.

인터페이스의 구현

클래스가 이 인터페이스를 상속(implements)하여 인터페이스에 정의된 모든 메소드를 구현해 주어야 객체 생성이 가능합니다. 그리고, 클래스의 상속에서 하나의 클래스는 하나의 클래스만을 직속으로 상속할 수 있는 것과는 달리, 하나의 클래스는 여러 개의 인터페이스를 구현해 줄 수 있습니다.

인터페이스도 클래스와 마찬가지로 인터페이스를 상속할 수 있습니다. 그러나, 클래스 상속과 한 가지 차이점은 클래스는 오직 하나의 클래스만 상속 가능한테 비해, 인터페이스는 여러 개의 인터페이스를 상속할 수 있습니다. 인터페이스가 상속하는 상위 인터페이스들은 ‘,’로 구분하고, 상위 인터페이스가 가지는 모든 상수와 메소드들을 상속하게 됩니다.

다음은 인터페이스 구현의 일반적인 형태입니다.


접근제어자 class [extends 클래스이름]  implements 상위인터페이스리스트 {
   // 인터페이스에 선언된 메소드 구현
}

Connection Pool (커넥션 풀)

커넥션 풀 기법이란 데이터베이스와 연결된 커넥션을 미리 만들어서 풀(pool)속에 저장해 두고 있다가 필요 할때에 커넥션을 풀에서 가져다 쓰고 다시 풀에 반환하는 기법을 의미합니다. 동시 접속자가 사용하는곳에 많이 사용하는 기법입니다.

Overloading Method

하나의 이름으로 여러 개의 메서드를 가지고 있습니다. 같은 이름을 가진 여러 개의 메서드를 말합니다. 보통 다중 정의, 중복 메서드라고 부르며 일반적으로는 Overloading이라고 합니다. 이것은 하나의 이름으로 여러 개의 메서드를 가지고 있다는 뜻을 내포하고 있습니다.

Overloading Method의 규칙

  1. n매개변수의 개수가 달라야 함
  2. n매개변수의 타입이 달라야 함

위의 개수와 타입 중 하나만 달라도 중복메서드의 조건이 성립 됩니다.

메서드의 리턴타입은 중복메서드 구분할 때 사용하지 않습니다.

오버라이딩

상속관계에서 상위 클래스와 하위 클래스에 동일한 이름의 메서드가 있는 것을 보고 이야기 하는 것

오버로딩와 오버라이딩의 공통점

오버로드와 오버라이드는 메소드의 이름이 같지만 때에 따라 다른 기능을 가지므로 다형성을 구현한 것

인스턴스(Instance)

클래스를 실제로 사용할 수 있도록 선언하는 것, 다시 말해서 클래스에 대한 변수를 선언하는 것을 “인스턴스를 생성한다(instantiate)”라 하고, 이렇게 생성된 변수를 인스턴스라 하며, 이 인스턴스는 메모리 공간을 차지하게 됩니다. 그리고 인스턴스의 메소드를 이용하여 변수들의 값을 설정 및 변경할 수 있습니다.

객체(Object)

클래스를 실제 사용할 수 있도록 변수 선언한 것을 인스턴스이며, 이 인스턴스를 객체라 할 수 있습니다. 객체는 높은 모듈성(modularity)과 정보은닉(information hiding)의 장점을 제공합니다.

다형성(Polymorphism)

다형성의 기본 개념은 여러 개의 클래스가 같은 메시지에 대해서 각자의 방법으로 작용할 수 있는 능력이라고 볼 수 있습니다. 다형성은 같은 이름을 갖는 여러 가지 형태가 존재합니다. 다형성을 제공해 주기 위해 C++에서는 연산자 다중 정의(overloading), 함수 다중 정의, 그리고 함수 재정의(overriding) 등을 제공해 주고 있지만, 자바에서는 메소드(함수) 다중 정의와 메소드 재정의를 제공해 주고 있습니다.

static

  1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙임.
    1. 인스턴스를 생성하면, 각 인스턴스들은 서로 독립적기 때문에 서로 다른 값을 유지. 경우에 따라서는 각 인스턴스들이 공통적으로 같은 값이 유지되어야 하는 경우 static을 붙임.
  2. static이 붙은 멤버변수는 인스턴스를 생성하지 않아도 사용할 수 있음.
    1. static이 붙은 멤버변수(클래스변수)는 클래스가 메모리에 올라갈때 이미 자동적으로 생성되기 때문.
  3. static이 붙은 메서드(함수)에서는 인스턴스 변수를 사용할 수 없음.
    1. static 메서드는 인스턴스 생성 없이 호출가능한 반면, 인스턴스 변수는 인스턴스를 생성해야만 존재하기 때문에 static이 붙은 메서드(클래스 메서드)를 호출할 때 인스턴스가 생성 되어있을 수도 그렇지 않을 수도 있어서 static이 붙은 메서드에서 인스턴스변수의 사용을 허용하지 않음. (반대로, 인스턴스 변수나 인스턴스 메서드에서는 static이 붙은 멤버들을 사용하는 것이 언제나 가능하다. 인스턴스 변수가 존재한다는 것은 static이 붙은 변수가 이미 메모리에 존재한다는 것을 의미하기 때문.)
  4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려.
    1. 메서드의 작업 내용 중에서 인스턴스 변수를 필요로 한다면, static을 붙일 수 없음. 반대로 인스턴스 변수를 필요로 하지 않는다면, 가능하면 static을 붙이는 것이 좋음. 메서드 호출시간이 짧아지기 때문에 효율이 높아짐. (static을 안붙인 메서드는 실행시 호출되어야 할 메서드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸림)
  5. 클래스 설계시 static의 사용지침
    1. 먼저 클래스의 멤버 변수중 모든 인스턴스에 공통된 값을 유지해야 하는 것이 있는지 살펴보고 있으면, static을 붙임.
    2. 작성한 메서드 중에서 인스턴스 변수를 사용하지 않는 메서드에 대해서 static을 붙일 것을 고려.
    3. 일반적으로 인스턴스 변수와 관련된 작업을 하는 메서드는 인스턴스 메서드(static이 안붙은 메서드)이고 static변수(클래스 변수)와 관련된 작업을 하는 메서드는 클래스 메서드(static이 붙은 메서드)라고 보면 됨


'언어 > Java' 카테고리의 다른 글

[Java] mybatis 비교 및 범위 쿼리 사용시 주의할 점  (0) 2017.02.22
[Java] static 사용 예제  (0) 2017.02.10
[Java] 자바 용어 정리  (0) 2017.02.10

+ Random Posts