목표
학습할 것
- 클래스 정의하는 방법
- 객체 만드는 방법 (new 키워드 이해하기)
- 메소드 정의하는 방법
- 생성자 정의하는 방법
- this 키워드 이해하기
클래스 정의하는 방법
객체 지향 프로그래밍(OOP, Object Oriented Programming)
- 모든 데이터를 객체(object)로 취급하며, 이러한 객체가 바로 프로그래밍의 중심임
- 객체의 상태(state)와 행동(behavior)을 구체화하는 형태의 프로그래밍
- 객체를 만들어 내기 위한 설계도와 같은 개념을 클래스(class)라고 함
클래스(class)
- 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성
- 필드(field)란 클래스에 포함된 변수(variable)를 의미 -> 상태, 멤버
- 메소드(method)란 어떠한 특정 작업을 수행하기 위한 명령문의 집합 -> 행동, 기능
인스턴스(instance)
- 클래스로부터 객체를 선언하는 과정을 클래스의 인스턴스화라고 함 -> 이렇게 선언된 해당 클래스 타입의 객체를 인스턴스(instance)라고 함
- 메모리에 할당된 객체
- 하나의 클래스로부터 여러 개의 인스턴스를 생성할 수 있으며 독립된 메모리 공간에 저장된 자신만의 필드를 가질 수 있음
- 해당 클래스의 모든 메소드(method)는 해당 클래스에서 생성된 모든 인스턴스가 공유하게 됨
클래스의 구성 요소
public class ClassTest { // 클래스 이름
String constructorVal; // 필드, 인스턴스 변수
String instanceVal; // 필드, 인스턴스 변수
static String classVal; // 필드, 클래스 변수
{ // 인스턴스 초기화 블록
System.out.println(this.instanceVal);
this.instanceVal = "instance";
System.out.println(this.instanceVal);
}
static { // 클래스 초기화 블록
System.out.println(classVal);
classVal = "class";
System.out.println(classVal);
}
public ClassTest(){
// super(); // 상속시 super 생성자 생략되어있음
}
public ClassTest(String constructorVal) { // 생성자
// super(); // 상속시 super 생성자 생략되어있음
this.constructorVal = constructorVal;
}
public void callMyNameWithCount(int count){ // 인스턴스 메소드
String myName = this.getClass().getName();// 지역 변수
for(int i = 0; i < count; i++){
System.out.println(myName);
}
}
public static void callMyClassVal(){ // 클래스 메소드
System.out.println(classVal);
}
public static void main(String[] args) {
ClassTest instance = new ClassTest("constructor");
instance.callMyNameWithCount(5);
ClassTest.callMyClassVal();
}
}
- 클래스 초기화 -> 인스턴스 초기화 -> 생성자 초기화 순으로 진행됨
접근 제어자
- public > protected > default > private
접근 제어자 |
같은 클래스의멤버 |
같은 패키지의 멤버 |
자식 클래스의 멤버 |
그 외의 영역 |
public |
O |
O |
O |
O |
protected |
O |
O |
O |
X |
default |
O |
O |
X |
X |
private |
O |
X |
X |
X |
필드
- 클래스에 포함된 변수를 의미함
- 선언된 위치에 따라 구분됨
변수 |
생성 시기 |
소멸 시기 |
저장 위치 |
클래스 변수(static variable), 공유변수(shared variable) |
클래스가 메모리에 올라갈 때 |
프로그램이 종료될 때 |
메소드 영역 |
인스턴스 변수(instance variable) |
인스턴스가 생성될 때 |
인스턴스가 소멸할 때 |
힙 영역 |
지역 변수(local variable) |
블록 내에서 변수의 선언문이 실행될 때 |
블록을 벗어날 때 |
스택 영역 |
inner class 컴파일
public class Point {
int x;
class InnerPoint {
int z;
class InnerInnerPoint {
int y;
}
}
}
- Point 클래스를 컴파일하게 되면 Point.class, Point$InnerPoint.class, Point$InnerPoint$InnerInnerPoint.class로 3개의 클래스파일이 생성됨
객체 만드는 방법(new 키워드 이해하기)
ClassTest classTest = new ClassTest();
ClassTest classTest = new ClassTest("ctor");
- new 키워드를 사용하여 객체를 생성할 때 자동으로 생성자가 호출됨
메소드 정의하는 방법
//1 2 3 4
public void callMyNameWithCount(int count){// 선언부
//구현부
String myName = this.getClass().getName();
for(int i = 0; i < count; i++){
System.out.println(myName);
}
}
ClassTest classTest = new ClassTest();
classTest.callMyNameWithCount(5); // 메소드 호출
- 접근제어자 = 해당 메소드에 접근할 수 있는 범위(private, public...)
- 반환 타입(return type) = 메소드가 모든 작업을 마치고 반환하는 데이터의 타입(String, Integer, Object, int...)
- 메소드 이름 = 메소드를 호출하기 위한 이름
- 매개변수 목록(parameters) = 메소드 호출 시에 전달되는 인수의 값을 저장할 변수들
- 구현부 = 메소드의 고유 기능을 수행하는 명령문의 집합
- 자바에서는 하나의 클래스에 같은 이름의 메소드를 둘 이상 정의할 수 없지만 메소드 오버로딩을 이용하여 같은 이름의 메소드를 중복하여 정의 가능
- 메소드 오버로딩(overloading) = 매개변수의 개수나 타입을 다르게 하여 같은 이름의 또 다른 메소드를 작성 가능
메소드
- 특정 작업을 수행하기 위한 명령문의 집합
- 메소드를 사용하면 중복되는 코드의 반복적인 프로그래밍을 피할 수 있음
- 모듈화로 인해 전체적인 코드의 가독성 향상
- 기능의 변경이 필요할 때도 쉽게 유지보수 가능
메소드 |
설명 |
클래스 메소드(static method) |
static 키워드를 가지는 메소드, 클래스 변수와 마찬가지로 인스턴스를 생성하지 않고도 바로 사용, 메소드 내부에서 인스턴스 변수를 사용할 수 없음 |
인스턴스 메소드(instance method) |
static 키워드를 가지지 않는 메소드 |
생성자 정의하는 방법
public ClassTest(){ // 매개변수가 없는 생성자, 기본 생성자
}
public ClassTest(String constructorVal) { // 매개변수가 있는 생성자
System.out.println(this.constructorVal);
this.constructorVal = constructorVal;
System.out.println(this.constructorVal);
}
ClassTest classTest = new ClassTest();
ClassTest classTest = new ClassTest("ctor");
생성자
- 객체 생성 시 해당 객체는 메모리에 즉시 생성되지만 이렇게 생성된 객체는 모든 인스턴스 변수가 아직 초기화되지 않은 상태임
- 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 생성자(constructor)라는 메소드를 제공
- 생성자(constructor)의 이름은 해당 클래스의 이름과 같아야 함
- 반환값이 없지만, 반환 타입을 void형으로 선언하지 않음
- 초기화를 위한 데이터를 인수로 전달받을 수 있음
- 객체를 초기화하는 방법이 여러 개 존재할 경우에는 하나의 클래스가 여러 개의 생성자를 가질 수 있음
기본 생성자(default constructor)
- 모든 클래스에는 하나 이상의 생성자가 정의되어 있어야 하지만 성자를 정의하지 않으면 자바 컴파일러가 기본 생성자(default constructor)라는 것을 기본적으로 제공해 줌
- 매개변수를 하나도 가지지 않으며, 아무런 명령어도 포함하고 있지 않음
- 매개변수를 가지는 생성자를 하나라도 정의했다면, 기본 생성자는 자동으로 추가되지 않음
this 키워드 이해하기
public ClassTest(String constructorVal) {
String constructorVal = "ctorv"; // 이럴경우
this.constructorVal = constructorVal; // 인스턴스 변수 this 필수
}
- this 참조 변수는 인스턴스가 바로 자기 자신을 참조하는 데 사용하는 변수
- this 참조 변수는 해당 인스턴스의 주소를 가리킴
- 생성자의 매개변수 이름과 인스턴스 변수의 이름이 같을 경우에는 인스턴스 변수 앞에 this 키워드를 붙여 구분해야 함
- this 참조 변수를 사용할 수 있는 영역은 인스턴스 메소드뿐이며, 클래스 메소드에서는 사용할 수 없음
this() 메소드
public ClassTest(){
this("defaultCtor");
}
public ClassTest(String constructorVal) {
this.constructorVal = constructorVal; // 인스턴스 변수 this 필수
}
- 생성자 내부에서만 사용할 수 있으며, 같은 클래스의 다른 생성자를 호출할 때 사용
- 인수를 전달하면, 생성자 중에서 메소드 시그니처가 일치하는 다른 생성자를 찾아 호출
- 한 생성자에서 다른 생성자를 호출할 때에는 반드시 해당 생성자의 첫 줄에서만 호출 가능