클래스
클래스란 자바의 설계도 같은것이고 이 설계도를 통해서 객체 (인스턴스)를 만들어서 이용할 수 있다 -> 객체지향 프로그래밍
객체 object
먼저 객체란 물리적으로 존재하거나 추상적으로 생각할 수 있는것중에서 자신의 속성을 가지며 식별 가능한 것이다
속성(field) + 동작(method)로 구성된다
클래스 class
- 자바의 설계도
- 인스턴스: 클래스로부터 만들어진 객체
- 객체지향 프로그래밍
클래스 선언
클래스 이름의 규칙
- 하나 이상의 문자
- 첫 글자는 숫자 불가능
- $,_ 외 특수문자 사용 불가능
- 자바 키워드 사용 불가능
클래스 이름.java로 소스파일을 생성한다
클래스로 부터 객체 생성
new 클래스();를 통해 객체를 생성한다 -> 힙 영역에 생성된다
객체 생성 후 객체 번지가 리턴 된다
클래스 멤버
1
2
3
4
5
6
7
8
9
10
11
public class ClassName {
//필드 객체의 데이터를 저장
int field;
ClassName(){
//생성자 객체 생성시 초기화를 담당
}
void methodName(){
//메소드 객체 동작의 역할 블록
}
}
필드
객체 고유의 데이터, 객체가 가져할 데이터, 객체의 상태, 데이터를 저장한다
필드 선언
클래스의 중괄호 블럭 내의 어디든 존재 가능 (메소드, 생성자 내부는 선언 불가능)
변수 선언과 유사하나 변수가 아님
1
2
3
4
5
public class ClassName {
//필드 객체의 데이터를 저장
int field;
String name = "minnnning";
}
필드의 초기값은 생략 가능하고 이경우 자동으로 기본값으로 초기화 된다
필드 사용
필드값을 읽고 변경하는 작업
클래스 내부에서는 필드의 이름을 이용한다, 클래스 외부에서는 클래스 객체를 생성한뒤에 필드를 사용할 수 있다
1
2
3
4
void function() {
Car myCar = new Car();
myCar.speed = 100; //필드를 사용하기 위해 객체를 myCar라는 객체를 생성함
}
생성자
클래스를 생성할때 생성자를 따로 선언하지 않아도 자동으로 추가된다 이 경우 기본 생성자로 생성
1
Car myCar = new Car();
1
2
3
public class Car {
//public Car(){} 이 기본 생성자가 실행된다
}
생성자 선언
1
2
3
4
5
6
7
public class Car {
int name;
//생성자
Car(int num, String name){
this.name = name;
}
}
위 경우와 같이 클래스 내부에 생성자가 있다면 반드기 선언된 생성자를 호출해서 객체를 생성해야한다 생성자는 여러개 가능(생성자 오버로딩)
생성자를 통해서 필드 값을 초기화 할때 필드와 매개변수 이름이 완전히 동일한 경우 this.필드로 표현한다
생성자 오버로딩
생성자를 오버로딩 (매개변수에 따라 달라짐) 매개 변수의 타입, 개수등이 다르면 다른 생성자로 이용할 수 있다
또한 생성자에서 this를 통해서 다른 생성자를 호출 할 수 있다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Car(String name) {
this.name = name;
this.color = "silver";
this.price = 100000;
}// 내부의 3줄이 중복 코드
Car(String name, int price) {
this.name = name;
this.color = "silver";
this.price = price;
}// 내부의 3줄이 중복 코드
Car(String name, int price, String color) {
this.name = name;
this.color = color;
this.price = price;
}// 내부의 3줄이 중복 코드
this를 이용해서 다른 생성자를 호출 (생성자 첫줄에만 가능)
1
2
3
4
5
6
7
8
9
10
11
12
13
Car(String name) {
this(name,"silver",100000);
}
Car(String name, int price) {
this(name,"silver",price);
}
Car(String name, int price, String color) {
this.name = name;
this.color = color;
this.price = price;
}
위 두 생성자가 마지막 생성를 다시 호출할 수 있다
메소드
리턴 타입
메소드를 실행한 후 나오는 결과값의 타입 , 리턴값이 없을 수 있다, 있다면 선언부에 명시
1
2
3
4
5
6
void on(){} //메소드
int plus( int x, int y){} //메소드
on();
int result = plus(10,30);
//리턴 타입에 다른 메소드 호출 방법 차이
메소드 이름
숫자 시작x , $와 _를 제외한 특수는 문자 사용 불가능
소문자 시작 다른 단어 혼합이면 그 단어 시작만 대문자로
메소드 오버로딩
같은 이름 타입의 메소드를 여러개 선언
매개변수 값에 따라 다양하게 처리할 수 있게 하기 위함 매개변수 타입, 개수, 순서중 하나가 달라야한다
매개변수를 보고 -> 메소드를 선택한다 (생성자 오버로딩과 비슷하다)
인스턴스 멤버
인스턴스 멤버는 객체를 생성한 뒤에 사용할 수 있는 필드와 메서드를 말한다
정적(static) 멤버
클래스에 고정된 멤버로 객체를 생성하지 않고 사용할 수 있는 필드와 메소드
1
2
3
4
5
6
public class Calculator {
// 정적 필드
static double pi = 3.14159;
// 정적 메소드
static int plus(int x, int y){...}
}
정적 멤버 사용
1
2
double result1 = 10 * Calculator.pi;
int result2 = Calculator.plus(10,2);
정적 멤버 선언 주의점
- 정적멤버 선언시 그 내부에 인스턴스 필드 및 메소드 사용 불가능
정적멤버 선언시 this 사용 불가능
- 정적 메소드에서 인스턴스 멤버를 사용할려면 객체를 생성 후 접근해야 한다
싱글 톤
싱글 톤은 전체 프로그램에서 단하나의 객체만 만들도록 보장하는 기법
- 클래스 외부에서 new를 통해서 생성자를 호출하는것을 불가능 하도록 private 접근 제한자 사용
- 자신의 타입인 정적 필드 선언 후 자신의 객체 생성해 초기화
- 외부에서 호출할 수 있는 getInstance() 선언
- 정적 필드에서 참조하는 자신의 객체 리턴
1
2
3
4
5
6
7
8
9
10
public class Car {
//정적 필드
private static Car singleton = new Car();
//생성자
private Car() {}
//정적 메소드
static Car getInstance(){
return signleton;
}
}
final 필드
초기값이 저장되면 최종값이 되어 프로그램 실행 도중에 수정 불가능
주로 필드 선어시 초기화, 객체 생성시 외부 데이터로 초기화 필요한 경우 생성자에서 초기화
관례적으로 모두 대문자로 작성한다
패키지
사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속된 경우 import를 통해서 가져와 사용할것을 컴파일러에 통지
접근 제한자
클래스와 인터페이스 및 이들이 가진 멤버의 점근 제한
- public : 외부 클래스다 자유롭게 사용할수 있도록 함
- protected : 같은 패키지 또는 자식 클래스에서 사용할 수 있도록 함
- default : 같은 패키지에 소속된 클래스에서만 사용
- private : 외부에서 사용할 수 없도록 함
Getter 와 Setter 메소드
Setter 메소드
외부의 값을 받아서 필드의 값을 변경하는 것이 목적 setXXX()
Getter 메소드
외부로 필드 값을 전달하는것이 목적 getXXX()