클래스
객체에 대한 정의의자, 객체의 설계도
이 설계도를 통해 만들어낸 것을 객체라고 한다
현실 객체, 클래스, 프로그램 객체의 관계
•
현실 객체의 속성과 기능은 추상화(abstraction) 되어 클래스에 정의된다.
•
클래스는 구체화되어 프로그램 객체(Instance, object)가 된다.
•
같은 클래스에서 생성된 객체는 모두 다른 객체이다.
클래스의 선언
•
클래스의 선언부와 몸체로 나뉘고, 몸체에는 클래스의 멤버가 선언된다.
•
클래스 멤버 구성
1.
객체의 초기화를 담당하는 생성자(Constructor)
2.
클래스가 가지는 속성을 정의하는 멤버 변수(Variable)
3.
클래스가 가지는 데이터를 조작하고 변환하는 메서드(Method)
접근 제한자(Access Modifier)
•
접근 제한자란 클래스, 변수, 메서드에 접근할 수 있는 권한을 나타내기 위해 사용된다.
•
접근 관련 modifier를 통해 정보 은닉을 구현할 수 있다.
클래스의 정의 - 선언부
[접근지정자][활용지정자] class 클래스 이름 [extend 부모클래스][implements 인터페이스,,,]
클래스 Modifier
•
접근 권한과 Modifier를 지정하지 않으면, 같은 패키지 내의 클래스에서만 접근이 가능하다.
•
서로 다른 패키지의 클래스에 접근하기 위해서는 public으로 지정해야 한다.
•
Java에서는 Outer Class, Inner Class에 따라 사용 가능한 접근지정자가 다르다
◦
Outer Class ⇒ default, public 사용 가능
◦
Inner Class ⇒ default, public, private, protected 사용 가능
활용 지정자 (사용 방법)
•
final ⇒ 상속 금지
•
abstract ⇒ 추상 클래스
클래스의 정의 - 멤버 변수
[접근지정자][활용지정자] Data_Type 변수이름 [= 초기값];
변수 Modifier
•
변수에 대한 접근 권한이나 활용 방법 제어
•
modifier 미지정 시 같은 패키지 내의 클래스에만 접근이 가능한 객체 변수라는 의미를 가짐
static 변수 (클래스 변수)
•
모든 인스턴스에서 공통된 값을 가지는 변수의 경우에는 멤버 변수(인스턴스 변수)로 선언하는 경우에는 불필요한 메모리 낭비가 발생할 수 있다.
•
static 키워드를 통해 클래스 변수로 선언하는 경우 클래스가 메모리에 로드될 때 1번만 로드되며, 객체가 아닌 클래스 단위의 변수를 가진다.
•
객체를 통해 클래스 변수를 변경하는 경우 다른 모든 객체들을 통해 호출되는 클래스 변수도 변경된 상태로 바뀐다.
final 변수 (상수)
•
final이 붙은 변수는 단 한 번 초기화가 가능하다. 하지만 그 이후에는 값을 변경할 수 없는 상수이다. (C++의 const와 같은 의미)
클래스의 정의 - 메서드
[접근지정자][활용지정자] Return_Type 메서드이름([매개변수,,,]) [throws 구문] {};
Method Modifier
•
접근 권한을 나타내는 Modifier의 경우 그 쓰임은 멤버 변수와 동일하다.
static Method
•
클래스로부터 인스턴스를 생성하지 않고 호출이 가능한 Method
•
인스턴스 변수는 인스턴스를 생성해야만 메모리가 잡히기 때문에 클래스 메서드에서는 상요이 불가능하다.
•
클래스 메서드에서는 클래스 메서드만 호출이 가능함!
final Method
•
자식 클래스에서 메서드를 재정의할 수 없도록 하는 예약어
abstract Method
•
메서드의 시그니쳐(리턴 타입, 메서드명, 매개변수)만 정의되고 구체적인 행위, 즉 블록( { } ) 부분은 정의되지 않는 메서드를 의미
•
추상 메서드를 선언할 때는 abstract 키워드를 메서드 앞에 붙인다.
•
메서드의 구체적인 행위를 표현하는 블록을 생략한다.
클래스의 정의 - 생성자
[접근지정자] 클래스이름([매개변수 ,,,]) [throws 구문] {}
•
new 연산자와 함께 상요되어 클래스로부터 객체를 생성할 때 호출되며, 객체의 멤버 변수를 초기화하는 데 사용되는 메서드
•
객체 생성 및 생성된 객체에 필요한 데이터를 초기화하는 과정을 단순화하여 코드의 양을 줄이는 역할을 수행한다.
생성자의 특징
1.
생성자는 클래스와 같은 이름을 가진 특별한 메서드로 객체 생성 시 멤버 변수의 초기화를 담당
2.
일반 멤버 메서드와 달리 반환형(Return Type)이 없음 << void도 허용되지 않음
3.
생성자는 이름은 같지만 매개변수를 달리하여 여러 개를 중복정의(Overloading) 할 수 있음
4.
생성자는 키워드 'new'와 항상 같이 사용됨 << new 생성자() 구문으로 호출
5.
명시적으로 작성하지 않을 경우, 기본 생성자(Default Constructor)가 제공됨
기본 생성자
•
모든 클래스에는 생성자가 반드시 존재하며, 하나 이상을 가질 수 있다.
•
클래스 내부에 생성자 선언을 생략하면 컴파일러는 기본 생성자(default Constructor)를 바이트 코드에 자동으로 추가시킨다.
•
컴파일러가 자동으로 기본 생성자를 추가해주는 경우는 클래스에 정의된 생성자가 하나도 없을때 뿐이다.
생성자 오버로딩
•
생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아 인스턴스의 초기화에 사용할 수 있다.
•
생성자 오버로딩을 통해 매개 변수를 달리하여 생성자를 여러 개 선언하여 다양화할 수 있다.
Public Class Car{
// 필드
String model;
String color;
// 기본 생성자
Car(){}
Car(String model){
this.model = model;
}
Car(String model, String color){
this.model = model;
this.color = color;
}
Java
복사
this 키워드
•
non-static 영역(instance 메서드, 생성자, instance 초기화자)에서만 사용할 수 있는 내장변수
•
현재 생성중인, 실행중인 그 객체 자신을 말함
this의 사용
1.
지역변수와 인스턴스 변수의 구분
void setName(String name){
this.name = name;
}
Java
복사
2.
생성자가 오버로딩된 경우, 자신의 또 다른 생성자 호출
Class Person{
private String name;
private int age;
Person(String name){
this.name = name;
}
Person(String name, int age){
this(name);
this.age = age;
}
}
Java
복사
3.
자기 자신의 객체를 메서드의 매개변수로 전달하거나 리턴
XXX(){
return this;
}
YYY(){
obj.zzz(this)
}
Java
복사