인터페이스란?

· 구현된 것은 아무 것도 없는 밑그림만 있는 기본 설계도.

· 일반 메서드 또는 멤버 변수를 가질 수 없고, 오직 추상 메서드상수만을 멤버로 가질 수 있다. → 추상 클래스보다 추상화가 더 높다.

· 인터페이스는 표준, 약속, 규칙 이다.

 

인터페이스 작성 방법

· class 대신 interface라는 키워드를 사용한다.

· class와 같이 접근 제어자로 public이나 default를 사용할 수 있다.

interface 인터페이스 이름 {
   public static final 타입 상수이름 = 값;
   public abstract 메서드이름(매개변수목록);
}

 

인터페이스 제약사항

· 모든 멤버 변수public static final 이어야 하며, 이를 생략 가능.

· 모든 메서드public abstract 이어야 하며, 이를 생략 가능.

 

인터페이스의 상속

· 인터페이스는 인터페이스로부터만 상속 받을 수 있다. (Object와 같은 최고 조상이 없다)

· 여러개의 인터페이스로부터 상속 가능. (다중 상속 가능)

interface Movable{
  void move(int x, int y);
}

interface Attackable {
  void attack(Unit u)l
}

interface Fightable extends Movable, Attackable {
}

 

인터페이스의 구현

· 그 자체로는 인스턴스를 생성할 수 없다.

· 구현한다는 의미의 implements를 사용해서 구현한다. (클래스는 확장한다는 의미에 extends를 사용)

· 만약 인터페이스의 메서드 중 일부만 구현한다면, 추상 클래스로 선언되어야 한다.

· 상속과 구현을 동시에 할 수 있다.

class 클래스이름 implements 인터페이스이름 {
  // 인터페이스에 정의된 추상 메서드를 구현
}

abstract class 클래스이름 implements 인터페이스이름 {
  // 인터페이스에 정의된 추상 메서드의 일부만 구현
}

class 클래스이름 extends 조상클래스이름 implements 인터페이스이름 {
}

 

 

인터페이스의 장점

· 개발 시간을 단축시킬 수 있음.

· 표준화가 가능.

· 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다. → 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다.

· 독립적인 프로그래밍이 가능.  → 클래스와 클래스간의 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면, 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않도록 독립적인 프로그래밍이 가능.

 

▶ 직접적인 관계의 두 클래스 (A-B)

class A {
  public void methodA(B b) {
    b.methodB();
  }
}
class B {
  public void methodB() {
    System.out,println("methodB()");
  }
}
class InterfaceTest {
  public static void main(String[] args) {
    A a = new A();
    a.methodA(new B());
  }
}

 

▶ 간접적인 관계의 두 클래스 (A-I-B)

class A {
  public void methodA(I i) {
    i.methodB();
  }
}
Interface I {
  void methodB();
}
class B implements I {
  public void methodB() {
    System.out.println("methodB()");
  }
}
class C implements I {
  public void methodB() {
    System.out.println("methodB() in C");
  }
}

 

 

추상 클래스와 인터페이스 비교

· 공통점

  - 스스로 객체를 생성할 수 없다.

  - 상속 관계에서만 존재한다. (구현을 목적으로 한다)

· 차이점

  - 다중 상속을 지원한다. (인터페이스)

  - 모든 자원이 미완성이다. (인터페이스)

 

 

 


WRITTEN BY
김치치즈스마일
세계정복!

,

다형성이란?

다형성은 이름 그대로 여러가지 형태를 가질 수 있는 능력을 의미 한다.

자바에서는 조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조할 수 있도록 한 것이다.

 

참조변수의 형변환

· 자손타입 → 조상타입 (Up-Castring) : 형변환 생략 가능

· 자손타입 ← 조상타입 (Down-Casting) : 형변환 생략 불가

· 형변환은 참조변수의 타입을 변환하는 것이지 인스턴스를 변환하는 것은 아니기 때문에 인스턴스에 아무런 영향을 미치지 않음.

단지, 참조변수의 형변환을 통해, 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 개수를 조절하는 것 뿐.

 


WRITTEN BY
김치치즈스마일
세계정복!

,

접근 제어자(Access Modifier)란?

제어자란 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여하는 것을 말한다.

그 중에서 접근 제어자는 멤버 또는 클래스에 사용되어, 해당 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할은 한다.

 

접근 제어자의 종류

· default - 같은 패키지 내에서만 접근이 가능. (실제로 default를 붙여서 사용하지는 않음)

· private - 같은 클래스 내에서만 접근이 가능. (객체 입장에서는 접근이 불가능)

· protected - 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능. (상속 관계에서는 public, 객체 입장에서는 private)

· public - 접근 제한이 없음.

 

제어자 

같은 클래스 

같은 패키지 

자손 클래스 

전체 

public 

O

O

O

O

protected

O

O

O

 

default 

O

O

 

 

private 

O

 

 

 

 

접근 제어자를 사용하는 이유

· 외부로부터 데이터를 보호하기 위해서.

· 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서.

 

 

[참고] 자바의 정석


WRITTEN BY
김치치즈스마일
세계정복!

,

오버로딩과 오버라이딩, 이름이 비슷해서 간혹 헷갈릴 때가 있을 것이다. (없으면 말고...)

그래서 이참에 오버로딩과 오버라이딩이 무엇인지 정리해보기로 했다.

 

오버로딩 (Overloading)

오버로딩이란 먼저 사전에서 overloading을 찾아보면 과적하다라고 나온다. 즉, 적재적량을 초과하여 많이 싣는 것을 의미한다.

Java에서의 오버로딩은 하나의 메서드 이름으로 여러 기능을 구현하기 때문에 이런 이름이 붙여진 것 같다.

 

오버로딩의 조건

· 메서드 이름이 같아야 한다.

· 매개변수의 개수 또는 타입이 달라야 한다.

· 매개변수는 같고 리턴 타입이 다른 경우는 오버로딩이 아니다.

 

Java에서 오버로딩의 예

println 메서드를 보면 매개변수의 타입들이 다른 것을 볼 수 있다.

 

오버로딩의 장점

어떤 이유 때문에 오버로딩을 사용할까?

만약 위에서 예를 든 println과 같이 같은 기능인데 매개변수가 다를 경우 어떻게 해야할까? 오버로딩이 없다면 printlnWithString, printlnWithInteger와 같이 이름을 각각 다르게 지어줘야 한다. 그래서 오버로딩을 사용하면 메서드의 이름을 간결하고도 짧게 지어서 같은 기능이면 같은 이름으로 묶어서 사용하여 메서드 이름을 절약할 수 있고 어떤 기능을 하는지도 쉽게 알 수 있다.

 

 

오버라이딩 (Overriding)

오버라이딩이란 사전에서 overriding을 찾아보면 다른 무엇보다 더 중요한 또는 최우선시 되는 이란 뜻으로 나온다.

Java에서의 오버라이딩은 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 말한다. 즉, 상속받은 조상의 메서드와 같은 메서드이지만 내용을 변경하여 자신이 현재 사용하고 있는 내용을 최우선시 하기 때문에 오버라이딩이란 명칭이 붙여진 것 같다.

 

오버라이딩의 조건

· 조상 클래스의 메서드와 이름이 같아야 한다.

· 조상 클래스의 메서드와 매개변수가 같아야 한다.

· 조상 클래스의 메서드와 리턴 타입이 같아야 한다.

· 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.

· 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

· 인스턴스 메서드를 static 메서드로 또는 static 메서드를 인스턴스 메서드로 변경할 수 없다.

 

 

그렇다면 오버로딩과 오버라이딩의 내용을 한마디로 요약하면

· 오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것.

· 오버라이딩 : 상속 받은 메서드의 내용을 변경하는 것.

 

 

 

 

'프로그래밍 > Java' 카테고리의 다른 글

다형성(polymorphsim)  (0) 2017.08.21
접근 제어자 (Access Modifier)  (0) 2017.08.19
JVM의 메모리 구조  (0) 2017.08.13
선언 위치에 따른 변수의 종류  (0) 2017.08.12
클래스와 객체와 인스턴스  (0) 2017.08.11

WRITTEN BY
김치치즈스마일
세계정복!

,

JVM은 용도에 따라 여러 영역으로 나누어 메모리를 관리한다.

과연 어떤식으로 관리하는지 알아보자.

 

 

메서드 영역 (Method Area = Class Area = Static Area)

· 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스 파일(*.class)을 읽어서 분석하여 클래스에 대한 정보를 이곳에 저장함. 이 때, 그 클래스의 클래스 변수도 이 영역에 함께 저장.

 

호출 스택 (Call Stack 또는 Execution Stack)

· 메서드의 작업에 필요한 메모리 공간을 제공.

· 메서드가 호출되면, 메서드 수행에 필요한 메모리 공간을 할당, 메서드가 종료되면 사용하던 메모리를 반환하고 스택에서 제거.

· 메서드가 작업을 수행하는 동안 지역 변수(매개 변수 포함)들과 중간 결과 등을 저장함.

· 호출 스택 맨 위에 있는 메서드가 현재 실행 중인 메서드.

 

힙 (Heap)

· 인스턴스가 생성되는 공간.

· new 연산자에 의해서 생성되는 배열과 객체는 모두 여기에 생성.

 

 

[참고] 자바의 정석

 

 

 

'프로그래밍 > Java' 카테고리의 다른 글

접근 제어자 (Access Modifier)  (0) 2017.08.19
오버로딩과 오버라이딩  (0) 2017.08.14
선언 위치에 따른 변수의 종류  (0) 2017.08.12
클래스와 객체와 인스턴스  (0) 2017.08.11
변수 타입에 따른 기본값  (0) 2017.08.05

WRITTEN BY
김치치즈스마일
세계정복!

,

변수는 멤버 변수(클래스 변수, 인스턴스 변수), 지역 변수로 나뉜다.

이렇게 변수의 종류를 결정하는 중요한 요소는 변수의 선언된 위치이다.

변수의 선언된 위치에 따라 종류를 알아보자.

 

 

 

변수의 종류 

선언 위치 

생성 시기 

 클래스 변수

(class variable)

클래스 영역 

클래스가 메모리에 올라갈 때 

 인스턴스 변수

(instance variable)

 인스턴스가 생성되었을 때

 지역 변수

(local variable)

 클래스 영역 이외의 영역

(메서드, 생성자, 초기화 블럭 내부)

 변수 선언문이 수행되었을 때

 

인스턴스 변수

· 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어짐.

· 인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있음.

· 인스턴스마다 고유한 상태를 유지해야하는 경우 인스턴스 변수로 선언.

 

클래스 변수

· 선언 방법은 인스턴스 변수 앞에 static을 붙여주면 됨.

· 인스턴스를 생성하지 않고도 언제라도 바로 사용할 수 있음.

  ex) 클래스이름.클래스변수

· 클래스가 로딩될 때 생서오디어 프로그램이 종료될 때까지 유지.

· 모든 인스턴스가 공통된 저장공간(변수)을 공유함. 그래서 공유 변수(Shared variable)라고도 함.

· 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야할 경우 클래스 변수로 선언해야 함. 

 

지역 변수

· 메서드 내에 선언되어 메서드 내에서만 사용가능.

· 메서드가 종료되면 소멸 됨.

· for문, while문의 블럭({ }) 내에 선언된 지역 변수는 블럭 내에서만 사용 가능하며, 블럭을 벗어나면 소멸됨.

· 반드시 초기화 하고 사용.

 

 

[참고] 자바의 정석

'프로그래밍 > Java' 카테고리의 다른 글

오버로딩과 오버라이딩  (0) 2017.08.14
JVM의 메모리 구조  (0) 2017.08.13
클래스와 객체와 인스턴스  (0) 2017.08.11
변수 타입에 따른 기본값  (0) 2017.08.05
객체 지향 프로그래밍이란?  (0) 2017.06.04

WRITTEN BY
김치치즈스마일
세계정복!

,

클래스와 객체의 정의와 용도는 어떤 것일까?

 

클래스

· 정의 : 클래스란 객체를 정의해 놓은 것.

· 용도 : 클래스는 객체를 생성하는데 사용.

 

객체

· 정의 : 실제로 존재하는 것, 사물 또는 개념.

· 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름.

 

프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻함.

쉽게 설명하자면 클래스는 제품의 설계도이고 객체는 설계도를 사용해 만든 제품이라고 볼 수 있다.

 

인스턴스

· 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 함.

· 클래스로부터 객체를 만드는 과정을 인스턴스화 라고 함.

· 객체는 모든 인스턴스를 대표하는 포괄적인 의미.

· 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미.

 

하지만 객체와 인스턴스는 같은 의미를 가지고 있으므로 엄격하게 구분할 필요는 없지만 문맥상의 차이는 있음.

 

[참고] 자바의 정석

'프로그래밍 > Java' 카테고리의 다른 글

오버로딩과 오버라이딩  (0) 2017.08.14
JVM의 메모리 구조  (0) 2017.08.13
선언 위치에 따른 변수의 종류  (0) 2017.08.12
변수 타입에 따른 기본값  (0) 2017.08.05
객체 지향 프로그래밍이란?  (0) 2017.06.04

WRITTEN BY
김치치즈스마일
세계정복!

,