-
객체지향 언어
1. 캡슐화
2. 상속
3. 추상화
4. 다형성 *
<클래스와 객체>
클래스의 정의: 클래스란 객체를 정의해 놓은 것
클래스의 용도: 클래스는 객체를 생성하는데 사용
객체의 정의: 실제로 존재하는 것. 사물 또는 개념
객체의 용도: 객체가 가지고 있는 기능과 속성에 따라 다름.
클래스 객체 제품 설계도 제품 TV 설계도 TV 붕어빵 기계 붕어빵 객체의 구성요소 - 속성과 기능
객체 = 속성(변수) + 기능(메서드)
TV
- 속성: 크기, 길이, 높이, 색상, 볼륨, 채널 등 -> 변수
- 기능: 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 변경하기 등 -> 메서드
class Tv {
String color; // 색깔
boolean power; //전원상태
int channel; // 채널
void power() {power = !power; }
void channelUp() {channel++;}
void channelDown() {channel--;}
}
객체와 인스턴스
객체: 모든 인스턴스를 대표하는 일반적 용어
인스턴스: 특정 클래스로부터 생성된 객체(예: Tv인스턴스)
클래스 -인스턴스화-> 인스턴스(객체)
하나의 소스파일에 여러 클래스 작성
Hello2.java
public class Hello2 {}
class Hello3 {}
public class가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야 한다.
Hello2.java
class Hello2 {}
class Hello3 {}
public class가 하나도 없는 경우, 소스파일의 이름은 'Hello2.java', 'Hello3.java' 둘 다 가능하다.
<잘못된 작성 예>
Hello2.java
public class Hello2 {}
public class Hello3 {}
하나의 소스파일에 둘 이상의 public class가 존재하면 안된다. 각 클래스를 별도의 소스파일에 나눠서 저장하던가 아니면 둘 중의 한 클래스를 public을 붙이지 않아야 한다.
main메서드를 가지고 있는 클래스와 소스파일의 이름이 일치해야 한다.
객체의 생성과 사용
1. 객체의 생성
클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
Tv t;
t = new Tv();
2. 객체의 사용(변수, 메서드 사용)
t.channel = 7; // Tv인스턴스의 멤버변수 channel의 값을 7로 한다.
t.channelDown(); // Tv인스턴스의 메서드 channelDown()을 호출한다.
Tv t1 = new Tv();
Tv t2 = new Tv();
t2 = t1; //t2의 참조주소값이 t1의 참조주소값과 같은 주소를 가리키게 됨
t1.channel = 7;
System.out.println("t1의 channel값은 "+t1.channel+"입니다."); // 7
System.out.println("t2의 channel값은 "+t2.channel+"입니다."); // 7
하나의 인스턴스를 여러 개의 참조변수가 가리키는 경우(가능)
여러 인스턴스를 하나의 참조변수가 가리키는 경우(불가능)
객체 배열
Tv[] tvArr = new Tv[3];
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();
Tv[] tvArr = {new Tv(), new Tv(), new Tv()};
클래스 변수와 인스턴스 변수
class Card {
//인스턴스 변수(개별 속성)
String kind; //무늬
int number; //숫자
// 클래스 변수(공통 속성)
static int width = 100; //폭
static int height = 250; //높이
}
클래스 변수와 인스턴스 변수 사용
Card c = new Card();
c.kind = "HEART";
c.number = 5;
Card.width = 200;
Card.height = 300;
기본형 매개변수
기본형 매개변수 - 변수의 값을 읽기만 할 수 있다.(read only)
참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다.(read&write)
참조형 매개변수
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.println("main() : x = " + d.x);
}
static void change(Data2 d) { // 참조형 매개변수
d.x = 1000;
System.out.println("change() : x = " + d.x);
}
}
결과
main() : x = 10
change() : x = 1000
After change(d)
main() : x = 1000
static 메서드와 인스턴스 메서드
class MyMath2 {
long a, b; // iv인스턴스 변수
long add() { //인스턴스 메서드
return a+b;
}
static long add(long a, long b) { // 클래스 메서드(static 메서드)
return a+b;
}
}
인스턴스 메서드
- 인스턴스 생성 후, '참조변수.메서드이름()'으로 호출
- 인스턴스 멤버(iv, im)와 관련된 작업을 하는 메서드
- 메서드 내에서 인스턴스 변수(iv) 사용가능
static 메서드(클래스 메서드): iv를 사용하지 않을 때 사용
- 객체생성 없이 '클래스이름.메서드이름()'으로 호출
- 인스턴스 멤버(iv, im)와 관련없는 작업을 하는 메서드
- 메서드 내에서 인스턴스 변수(iv) 사용불가
public static void main(String args[]) {
System.out.println(MyMath2.add(200L, 100L); //클래스메서드 호출
MyMath2 mm = new MyMath2(); //인스턴스 생성
mm.a = 200L;
mm.b = 100L;
System.out.println(mm.add()); // 인스턴스 메서드 호출
}
오버로딩(overloading)
: 한 클래스 안에 같은 이름의 메서드 여러 개 정의하는 것
오버로딩이 성립하기 위한 조건(3가지)
1. 메서드 이름이 같아야 한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.
3. 반환 타입은 영향없다.
생성자(constructor)
- 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'
Time t = new Time(12, 34, 56);
- 이름이 클래스 이름과 같아야 한다.
- 리턴값이 없다.(void 안붙임)
- 모든 클래스는 반드시 생성자를 가져야 한다.
class Card {
Card() { // 매개변수 없는 생성자
// 인스턴스 초기화 작업
}
Card(String kind, int number) { // 매개변수 있는 생성자
// 인스턴스 초기화 작업
}
}
기본 생성자(default constructor)
- 매개변수가 없는 생성자
- 생성자가 하나도 없을 때만, 컴파일러가 자동 추가
클래스이름() {}
생성자 this()
- 생성자에서 다른 생성자 호출할 때 사용
- 다른 생성자 호출시 첫 줄에서만 사용가능
class Car2 {
String color;
String gearType;
int door;
Car2() {
this("white", "auto", 4);
}
Car2(String color) {
this(color, "auto", 4);
}
Car2(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
참조변수 this
- 인스턴스 자신을 가리키는 참조변수
- 인스턴스 메서드(생성자 포함)에서 사용가능
- 지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용
Car(String color, String grearType, int door) {
// this.color는 iv, color는 lv
this.color = color;
this.gearType = gearType;
this.door = door;
}
변수의 초기화
- 지역변수(lv)는 수동 초기화 해야함(사용전 꼭)
- 멤버변수(iv, cv)는 자동 초기화 된다.
초기화 블럭
- 인스턴스 초기화 블럭: {}
- 클래스 초기화 블럭: static {}
클래스 변수 초기화 시점: 클래스가 처음 로딩될 때 단 한번
인스턴스 변수 초기화 시점: 인스턴스가 생성될 때 마다