객체 지향 프로그래밍
- 절차적 프로그래밍 : 메소드를 중심으로 프로그램을 만들어 나가는 프로그래밍
- 객체 지향 프로그래밍 : 관련있는 변수와 메소드를 모은 수납상자와 같은 클래스를 이용해서 프로그램의 구조를 만들어 가는 방식
- 객체 지향 언어 : 이러한 방식을 언어 차원에서 지원하는 프로그래밍 언어
클래스
- 클래스는 관련있는 변수들과 메소드가 묶여있다.
클래스의 형식
- 클래스는 한 파일에 여러개 넣을 수 있지만, 접근제어자 public은 같은 이름의 클래스에 하나만 붙일 수 있다.
- 소스 코드를 컴파일 할 때 그 안에 들어있는 클래스는 따로따로 하나씩 class 파일로 만들어진다.
이클립스에서 클래스 추출
- 이전 챕터에서 이클립스를 활용하여 메소드를 추출한 것처럼 클래스도 가능하다.
- 영역 선택 -> 우클릭 -> Refactor -> Move Types to new Files...로 하면 된다.
클래스와 인스턴스
- 클래스는 어떠한 형틀이고, 인스턴스는 그 형틀로 찍어낸 실체와 같다.
- 클래스를 변경하면 인스턴스에 영향을 주지만, 인스턴스는 변경하더라도 다른 인스턴스들에게 영향을 주지 않는다.
public class OthersOOP {
public static void main(String[] args) throws IOException {
System.out.println(Math.PI);
System.out.println(Math.floor(1.8));
System.out.println(Math.ceil(1.8));
FileWriter f1 = new FileWriter("data.txt");
f1.write("Hello");
f1.write(" Java");
FileWriter f2 = new FileWriter("data2.txt");
f2.write("Hello");
f2.write(" Java2");
f2.close();
f1.write("!!!");
f1.close();
}
}
- 여기서 클래스는 System, Math, FileWriter이고, 인스턴스는 f1, f2이다.
static 변수와 메소드
- static 변수/메소드는 클래스에서 생성된 모든 인스턴스가 공유한다.
- static 변수/메소드는 인스턴스를 만들지 않더라도 클래스에서 직접 호출이 가능하다.
- static이 아닌 변수/메소드는 클래스에서 바로 접근이 불가능하다. 인스턴스를 생성해야 비로소 접근이 가능하다.
- 따라서 static 메소드 안에서는 static 유무와 관계없이 변수/메소드 모두 사용 가능하지만, static이 아닌 메소드 안에서는 static 변수/메소드를 사용할 수 없다.
생성자와 this
생성자
- 클래스는 인스턴스를 생성할 때 클래스의 이름과 같은 이름인 생성자로 인스턴스를 만든다.
- 생성자를 따로 만들어 주지 않으면 기본 생성자가 자동으로 포함된다.
Foo foo = new Foo() // 기본 생성자
- 인스턴스를 생성할 때 필드를 초기화하는 작업을 같이 하고 싶다면, 생성자에 파라미터를 설정해주면 된다.
- 생성자는 접근 권한을 설정할 수 있다.
- 리턴 타입은 명시하지 않는다.
this
- 생성자도 클래스 내부의 메소드이고, 초기화 할 필드를 파라미터로 넣기 때문에 보통 파라미터명과 필드명이 겹치게된다.
- 이때 this를 사용하면 겹치는 문제를 해결할 수 있다.
- this는 해당 인스턴스를 가리키는 예약어다.
class Print {
public String delimiter = "";
public Print() {}
public Print(String delimiter) {
this.delimiter = delimiter;
}
public class MyOOP {
public static void main(String[] args) {
Print p1 = new Print("----");
Print p2 = new Print();
}
}