목차

  1. 추상 클래스 (abstract class)
  2. 인터페이스 (interface)
  3. 추상클래스와 인터페이스의 비교

1. 추상 클래스(abstract class)

  • 클래스의 프레임만 구성
  • 하나 이상의 추상 메소드 포함
    (추상 메소드: 선언 부분만 있고 구현 부분이 없는 메소드)
  • 직접 객체 생성 불가능
  • 추상 클래스에서 정의된 추상적인 기능은 하위 클래스에서 상세 구현

 

추상 클래스 용도

1. 실체 클래스들의 공통된 필드와 메소드의 이름을 통일할 목적

2. 실체 클래스를 작성할 때 시간 절약

 

2. Interface

특징

  • 실제 구현된 것이 전혀 없는 기본 설계도.(알맹이 없는 껍데기) - 설계와 구현 분리 가능
  • 멤버는 추상메서드와 상수만을 가능 => public static final, public abstract 키워드 생략 가능
  • 인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용됨.
  • 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는 데 사용됨.
  • 인터페이스끼리는 다중 상속 가능

장점

  • 개발시간을 단축시킬 수 있다.
    - 일단 인터페이스가 작성되면, 이를 사용하여 프로그램을 작성하는 것이 가능. 
    - 인터페이스가 공통이므로 동시 개발 가능
  • 표준화가 가능하다.
    - 프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 후 개발되도록 함. 일관되고 정형화된 프로그램 개발 가능.
  • 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
    - 하나의 인터페이스를 공통적으로 구현함으로써 관계 매핑

  • 독립적인 프로그래밍이 가능하다.
    - 클래스의 선언과 구현을 분리시킬 수 있음.
    - 클래스와 클래스 간의 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면, 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능

 

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

구분 추상 클래스 인터페이스
선언 abstract class 클래스명 {
    변수;
    메서드() {...}
    abstract 메서드();
}
interface 인터페이스명 {
     상수;       // public final static
     메서드(); // public abstract
}
상속 class Sub extends super {
   메서드 재정의 // overriding
}
class Sub implements Interface1, Interface2 {
    메서드 재정의 // overriding
}
장점 프레임 제공 프레임 제공, 다중 상속

 

 

목차

  1. class 구성 멤버
  2. 인스턴스 멤버와 정적 멤버
  3. final 필드와 상수
  4. 패키지
  5. 접근 제한자 (Access modifer)
  6. 중첩 클래스 (Inner class)
  7. 어노테이션 (Annotation)

1. Class의 구성 멤버

Field

- = 멤버 변수 = 인스턴스 변수

- dot(.) 연산자: 객체 접근 연산자

 

Constructor

new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화 담당

- default constructor: {}, 클래스 내부에 생성자 선언이 없다면 컴파일러가 바이트코드에 자동으로 추가

- 생성자 오버로딩(Overloading): 매개변수를 달리하는 생성자를 여러개 선언하는 것

 

Method

- 메소드가 호출되면 수행에 필요한 메모리를 스택에 할당, 마치면 메모리 반환

- 매개변수: call by value(값을 전달), call by reference(객체 참조 주소 전달)

- 메소드 오버로딩(Overloading): 클래스 내에 같은 이름의 메소드를 여러개 선언하는 것

 

Overloading

 

2. 인스턴스 멤버와 정적 멤버

=> 언제 사용해주면 좋을까?! 객체마다 가지고 있어야 할 데이터라면 instance field, 공용적인 데이터라면 static field

 

인스턴스 멤버와 this

- instance member: 객체(instance)를 생성한 후 사용할 수 있는 필드와 메소드 (instance field, instance method)

- 참조변수 this

: 인스턴스 자신을 가리키는 참조변수
: 인스턴스의 주소가 저장되어 있음

 

정적 멤버와 static

- = 클래스 변수 or 메소드 = 정적 변수 or 메소드 = 공용 변수 or 메소드

클래스에 고정된 멤버. 클래스 로더가 클래스(바이트 코드)를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리. 따라서 클래스 로딩이 끝나면 바로 사용 가능

- 클래스이름.필드 or 클래스이름.메소드(매개변수) 로 접근하여 바로 사용

public class 클래스 {
    static 타입 필드;	// 정적 필드
    static 리턴 타입 메소드(매개변수 ...) {...} // 정적 메소드
}

 

- 정적 초기화 블록: 정적 필드 초기화 작업을 위해 제공

static {
....
}

- 정적 메소드나 정적 블록의 내부에는 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다.
-> 사용하고 싶다면 메소드 안에 객체를 먼저 생성하고 참조변수로 접근

 

 

3. final 필드와 상수

- final 필드: 초기값이 저장되면 최종적인 값이 되어 수정할 수 없는 것

- 초기값 주는 방법: 1) 필드 선언시 2) 생성자 호출시

 

- 상수(final static)

: 불변의 값. 객체마다 저장할 필요가 없는 공용성을 띔.

: final만은 상수는 아님. 객체마다 다른 값을 가질 수 있기 때문

: static block으로 초기화 가능

: 상수 이름은 대문자로 작성이 관례

 

 

4.  패키지

- 자바에서는 클래스를 체계적으로 관리하기 위해 패키지(package)를 사용

- 패키지의 물리적인 형태는 파일 시스템 폴더

- 클래스 이름이 동일하더라도 패키지가 다르면 다른 클래스로 인식.

=> 클래스의 전체 이름: 상위패키지.하위패키지.클래스

- 소문자로 작성하는 것이 관계

 

 

5. 접근 제한자(access modifier)

접근 제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메서드, 생성자

 

- public: 접근 제한 없음

- protected: 같은 패키지내에서, 다른 패키지의 자손클래스에서 접근 가능

- default: 같은 패키지내에서만 접근 가능

- private: 같은 클래스내에서만 접근 가능

 

...더보기

제어자의 조합

  1. 메서드에 static과 abstract를 함께 사용할 수 없다.
    - static메서드는 몸통(구현부)이 있는 메서드에만 사용할 수 있기 때문
  2. 클래스에 abstract와 final을 동시에 사용할 수 없다.
    - 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고, abstract는 상속을 통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문
  3. abstract메서드의 접근제어자가 private일 수 없다.
    - abstract메서드는 자손클래스에서 구현해주어야 하는데 접근 제어자가 private이면, 자손클래스에서 접근할 수 없기 때문
  4. 메서드에 private과 final을 같이 사용할 필요 없음
    - 접근 제어자가 private인 메서드는 오버라이딩될 수 없기 때문
    - 이 둘 중 하나만 사용해도 의미가 충분.

 

6. Getter와 Setter 메소드

객체지향 프로그래밍에서는 외부에서 직접적으로 객체의 데이터 접근을 막는다.

-> 객체의 무결성(결점이 없는 성질)이 깨질 수 있기 때문. - 매개값을 검증해서 유효한 값만 데이터 저장함.

 

: 메소드를 통해서 데이터 변경 => Getter / Setter

 

 

7. Inner class

: 특정 클래스 내에서만 주로 사용되는 클래스를 내부 클래스로 선언

: 장점: 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근가능, 코드의 복잡성 줄일 수 있음(캡슐화)

 

특징

  • 클래스 내부에 또 다른 클래스를 가짐으로 클래스 관리의 효율을 높인 것
  • 형식과 생성파일
    - 형식: class Outer { class Inner {...} } 
    - 생성파일) Outer.class, Outer$Inner.class
  • 객체 생성
    - Outer.Inner oi = new Outer().new Inner();
class InnerEx1 {
	class InstanceInner {
    	int iv = 100;
        // static int cv = 100;		// *error! static 변수 선언할 수 없음.*
        final static int CONST = 100;	// *final static은 상수이므로 허용*
    }
    
    static class StaticInner {
    	int iv = 200;
        static int cv = 200;		// *static class만 static 멤버 정의 가능*
    }
    
    void myMethod() {
    	class LocalInner {
        	int iv = 300;
            // static int cv = 300;	// error! static 변수 선언할 수 없음.
            final static int CONST = 300; // final static은 상수이므로 허용
        }
    }
}

 

Anonymous inner class (익명 중첩 클래스)

  • - 기존 클래스의 특정 메서드를 오버라이딩하여 원하는 형태로 재정의하여 사용하는 방식
    - 외부 멤버 중 final만 포함할 수 있음.
  • 형식과 생성파일
    - 형식: class Outer {method() { new Inner() { ... }}}
    - 생성파일: Outer.class, Outer$숫자.class
  • 객체 생성: new Inner() 자체가 객체 생성임.
import java.awt.*;
import java.awt.event.*;

class InnerEx8 {
	public static void main(String[] args) {
    		Button b = new Button("Start");
        	b.addActionListener(new ActionListener() {
        		public void actionPerformed(ActionEvent e) {
            		System.out.println("ActionEvent occured!");
            	}
        	});	// 익명 클래스의 끝
	} // main메서드의 끝
} // InnerEx8클래스의 끝

 

7. 어노테이션(Annotation)

추가예정

 

목차

  1. Variable (변수)
  2. Primitive Type (기본 타입)
  3. Reference Type (참조 타입)

1. Variable (변수)

하나의 값을 저장할 수 있는 메모리 공간

int score; 	// 공간 할당
score = 90; 	// 값 저장

Literal: 직접 입력된 값

  • 정수 리터럴
    - 10진수(기본), 8진수(0으로 시작), 16진수(0x or 0X로 시작)
    - byte, char, short, int, long
  • 실수 리터럴
    - ex) 3e6 // 3*10⁶ (e or E: 10의 지수)
    - float, double
  • 문자 리터럴
    - 작은 따옴표(‘’)로 묶은 텍스트, 하나의 문자 리터럴
    - escape character: 역슬래쉬(\)가 붙은 문자 리터럴 ex) ‘\t’, ‘\n’ …
    - char
  • 문자열 리터럴
    - 큰 따옴표(“”)로 묶은 텍스트
    - String
  • 논리 리터럴
    - boolean

 

2. Primitive Type (기본 타입)

  • Java언어에 이미 존재하고 있는 데이터 타입
  • 실제값 변수에 저장

메모리 사용 크기(정수타입): -2^(n-1) ~ 2^(n-1)-1

정수 타입

  • char Type
    - 2 byte
    - 자바는 모든 문자를 유니코드(Unicode)로 처리 (Unicode:세계 각국의 문자들을 코드값으로 매핑한 국제 표준 규약)
    - 0 ~ 127까지는 ASCII 문자 할당
    - 음수 저장 안됨
char var1 = 'A' // 유니코드 0x0041 -> 2진수: 00000000 01000001
char var2 = 65;
char var3 = '\u0041';  // '\u + 16진수값'

 

  • int Type
    - 변수에 어떤 진수(10,8,16진수)를 입력하더라도 동일한 값이 2진수로 변환되어 저장
  • long Type
    - 수치가 큰 데이터를 다루는 프로그램에서 필수적
    - 변수 초기화: 정수값 뒤에 l 또는 L 붙임.

실수 타입

  • float과 double의 메모리 사용 크기는 각각 int와 long의 크기와 같지만, 정수 타입과는 다른 저장 방식 때문에 훨씬 더 큰 범위의 값을 저장할 수 있음.
  • 자바의 실수 리터럴의 기본 타입: double

 

타입 변환 (Type Casting)

  • 자동 타입 변환 (promotion) : 큰 크기 타입 <- 작은 크기 타입 (메모리 크기)
    - byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)
      float가 뒤인 이유?! 표현할 수 있는 값의 범위가 float이 더 크기 때문
    - char type의 경우 int type으로 자동 변환. 
     but! 음수 저장이 안되므로 byte타입은 자동 변환 안됨.
char charValue = 'A';
int intValue = charValue; // 65 저장
byte byteValue = 65;
char charValue2 =byteValue; // compile error

 

  • 강제 타입 변환

강제 타입 변환에 의한 값 손실

 

자바는 코드에서 데이터 값을 검사하기 위해 boolean과 char을 제외하고 모든 기본 타입에 대해 최대값과 최소값을 상수로 제공

// 값의 손실이 발생하는지 체크
if ( (i<Byte.MIN_VALUE) || (i>Byte.MAX_VALUE)) {
 // 값 손실 발생
}

 

3. Reference Type (참조 타입)

  • Array, Enum, Class, Interface 
  • 변수(스택)에 메모리 번지를 저장 -> 실제 값은 힙영역에 저장
  • 참조 변수에서의 ==, != : 주소값 비교 연산
  • null: 힙 영역의 객체를 참조하지 않는다 (참조 타입 변수에서 사용)
    NullPointerException:  참조타입 변수가 null을 가지고 있을 경우(사용할 수 없는 경우) 접근할 때 생기는 오류
  • new 연산자 (객체 생성 연산자): 힙영역에 새로운 객체를 만드는 연산자 

참조변수의 형변환

- Up-casting: 조상 <- 자손 : 자동형변환 (생략 가능)

- Down-casting: 조상 -> 자손  : 강제 형변환 

 

String

- 자바는 문자열 리터럴이 동일하다면 String객체를 공유

 

String name1 = "신용권";

String name2 = "신용권";

 

Array

  • 다차원 배열: 
    int[][] a = new int[2][3]             // 2(행)*3(열) 배열
    int a[][] = {{1,2,3,4,5}, {11,12,13,14,15}, {21,22,23,24,25}}; // {{ -> 차원의 개수
  • element별로 다른 길이의 배열을 가질 수 있음.
    int a[][] = {{1,2}, {1,2,3}};
  • 배열 복사
    System.arraycopy(a, 1, b, 0, a.length-1); // SourceArray, SPosition, TargetArray, TPosition, length
  • Shallow copy(얕은 복사) vs. Deep copy(깊은 복사) -> 추후 예정

element는 힙영역에 할당됨

 

Enum

- ...

 

 

 

 

 

 

 

Ref. 이것이 자바다 - 신용권의 Java 프로그래밍 정복

+ Recent posts