객체지향 언어
- 코드의 재사용성이 높고 유지보수가 용이. 중복 코드 제거
핵심개념
- 캡슐화
- 상속
- 추상화
- 다형성
- 클래스의 정의 : 클래스란 객체를 정의해 놓은 것
- 클래스의 용도 : 클래스는 객체를 생성하는데 사용
- 객체의 정의 : 실제로 존재하는 것, 사물 또는 개념
- 객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
객체 = 속성(변수) + 기능(메서드)
- 객체 : 모든 인스턴스를 대표하는 일반적 용어
- 인스턴스 : 특정 클래스로부터 생성된 객체 (예: Tv인스턴스)
Q. 클래스가 왜 필요한가?
A. 객체를 생성하기 위해
Q. 객체가 왜 필요한가?
A. 객체를 사용하기 위해
Q. 객체를 사용한다는 것은?
A. 객체가 가진 속성과 기능을 사용하려고
객체의 생성과 사용
//1 .객체의 생성
Tv t; //클래스명 변수명;
t = new Tv(); //변수명 = new 클래스명();
//2. 객체의 사용
t.channel = 7;
t.channelDown();
System.out.println("현재 채널은" + t.channel + "입니다.");
클래스 1.설계도 2.데이터+함수 3.사용자 정의 타입
class Variables {
int iv; // 인스턴스 변수
static int cv; //클래스 변수(static변수, 공유변수)
void method() {
int lv = 0; // 지역변수
}
}
- 클래스 변수(static) : 클래스가 메모리에 올라갈 때 생성 -> 객체생성 필요x, 참조변수 필요x, 그냥 사용가능
- 인스턴스 변수 : 인스턴스가 생성되었을 때 생성
- 지역변수 : 변수 선언문이 수행되었을 때 생성
❓ CV : 모든 객체가 공유하는 값
- 메서드
1 .작업단위로 문장들을 묶어서 이름 붙인 것
2 .값(입력)을 받아서 처리하고, 결과를 반환(출력)int add (int x, int y) { int result = x + y; return result; //결과를 반환 }
return문
- 실행 중인 메서드를 종료하고 호출한 곳으로 되돌아간다.
호출 스택(call stack)
- 메서드 수행에 필요한 메모리가 제공되는 공간
- 메서드가 호출되면 호출스택에 메모리 할당, 종료되면 해제
- 스택(stack) : 밑이 막힌 상자. 위에 차곡차곡 쌓인다.
기본형 매개변수
- 기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.
- 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.
⛔ 6-23 기본형 매개변수 다시 ⛔
class Data { int x; }
class Ex6_6 {
public static void main (String[] args) {
Data d = new Data();
d.x = 10;
System.out println("main() : x = " + d.x);
change(d.x);
System.out.println("After change(d.x)");
System.out.println("main() : x = " + d.x);
}
static void change(int x) { //기본형 매개변수
x = 1000;
System.out.println("change() : x = " x);
}
}
⛔ 6-24 참조형 매개변수 다시 ⛔
class Data2 { int x; }
class Ex6_7 {
public static void main(String[] args) {
Data2 d = new Data2();
d.x = 10;
System.out.println("main() : x = " + d.x);
change(d);
System.out.println("After change(d)");
System.out.pringln("main() : x = " + d.x);
}
static void change(Data2 d) { //참조형 매개변수
d.x = 1000;
System.out.pringln("change() : x = " + d.x);
}
}
인스턴스 메서드
- 인스턴스 생성 후, '참조변수.메서드이름()'으로 호출
- 인스턴스 멤버(iv, im)와 관련된 작업을 하는 메서드
- 메서드 내에서 인스턴스 변수(iv) 사용가능
static 메서드 (클래스 메서드)
- 객체생성 없이 '클래스이름. 메서드이름()'으로 호출
ex) Math.random(), Math.round()
- 인스턴스 멤버(iv, im)와 관련없는 작업을 하는 메서드
- 메서드 내에서 인스턴스 변수(iv) 사용불가
class MyMath {
long a, b; //인스턴스 변수
long add() { //인스턴스 메서드(iv 사용)
return a+b;
}
static long add(long a, long b) { //클래스 메서드(static 메서드)
return a+b;
}
}
class MyMathTest {
public static void main(String args[]) {
System.out.println(MyMath.add(200L, 100L); //클래스메서드 호출
MyMath mm = new MyMath(); //인스턴스 생성
mm.a = 200L;
mm.b = 100L;
System.out.println(mm.add()); //인스턴스메서드 호출
}
}
static 사용방법
- 속성(멤버변수)중에서 공통 속성에 static을 붙인다.
- 인스턴스 멤버(iv, im)을 사용하지 않는 메서드에 static을 붙인다.
⛔ 6-27 static 변수/메서드와 instance 변수/메서드 관계 정리 다시 ⛔
오버로딩 (overloading)
- 한 클래스 안에 같은 이름의 메서드 여러 개 정의하는 것
오버로딩이 성립하기 위한 조건
1 .메서드 이름이 같아야 한다.
2 .매개변수의 개수 또는 타입이 달라야 한다.
3 .반환 타입은 영향없다.
생성자(constructor)
- 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'
- 인스턴스 생성시 수행할 작업(iv 초기화)에 사용
생성자 규칙
1 .이름이 클래스 이름과 같아야 한다.
2 .리턴값이 없다(void 안붙임)
3 .모든 클래스는 반드시 생성자를 가져야 한다.
기본생성자
- 매개변수가 없는 생성자
- 생성자가 하나도 없을 때만, 컴파일러가 기본 생성자 자동 추가
(기본생성자가 반드시 있어야함)
생성자 this()
- 생성자에서 같은 클래스의 다른 생성자 호출할 때 사용
- 다른 생성자 호출시 첫 줄에서만 사용가능
참조변수 this
- 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.
- 인스턴스 메서드(생성자 포함)에서 사용가능
- 지역변수 (lv)와 인스턴스 변수(iv)를 구별할 때 사용
Car(String color, String gearType, int door) {
//this.color는 iv, color는 lv
this.color = color;
this.gearType = gearType;
this.door = door;
}
class MyMath {
long a, b; //this.a, this.b
MyMath(int a, int b) { //생성자
this.a = a;
this.b = b;
}
long add() { //인스턴스 메서드
return a+b; //return this.a+this.b;
}
static long add(long a, long b) { //클래스 메서드(static메서드)
return a+b;
}
}
멤버변수의 초기화 방법
1 .명시적 초기화(=) - 간단초기화
2 .초기화 블럭 {}/ static{} - 복잡초기화
3 .생성자(iv초기화) - 복잡초기화
클래스 변수의 초기화 시점 : 클래스가 처음 로딩될 때 단 한번
인스턴스 변수 초기화 시점 : 인스턴스가 생성될 때 마다