2023/09
객체지향이론의 기본 개념
객체지향언어의 주요 특징
⇒ 코드의 재사용성이 높고 유지보수가 용이하다
⭐️ 재사용성, 유지보수, 중복된 코드의 제거
클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성된다
class Tv {
String color; //색깔
boolean power; //전원상태
int channel; //채널
void power(){
power = !power;
}
void channelUp(){
channel++;
}
void channelDown(){
channel--;
}
}
class TvTest {
public static void main(String args[]) {
Tv t;
t = new Tv();
t.channel = 7;
t.channelDown();
System.out.println("현재 채널은 " + t.channel + "입니다.");
}
}
class Tv {
String color; //색깔
boolean power; //전원상태
int channel; //채널
void power(){
power = !power;
}
void channelUp(){
channel++;
}
void channelDown(){
channel--;
}
}
class TvTest2 {
public static void main(String args[]) {
Tv t1 = new Tv();
Tv t2 = new Tv();
System.out.println("t1의 channel 값은 " + t1.channel + "입니다.");
System.out.println("t2의 channel 값은 " + t2.channel + "입니다.");
t1.channel = 7;
System.out.println("t1의 channel값을 7로 변경하였습니다.");
System.out.println("t1의 channel 값은 " + t1.channel + "입니다.");
System.out.println("t2의 channel 값은 " + t2.channel + "입니다.");
}
메서드(method)는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다
메서드를 사용하는 이유
자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다. 이처럼 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩(method overloading)' 또는 '오버로딩(overloading)'이라 한다.
- 메서드 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
주의할 점 : 오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다
대표적인 예 : println 메서드
println메서드를 호출할 때 매개변수로 지정하는 값의 타입에 따라서 호출되는 println 메서드가 달라진다
//보기1
//오버로딩 성립X
//매개변수의 이름만 다를 뿐 매개변수의 타입이 같음
int add(int a, int b){return a+b;}
int add(int x, int y) {return x+y;}
//보기2
//오버로딩 성립X
//리턴타입만 다름
int add(int a, int b){return a+b;}
int add(int a, int b) {return long(a+b);}
}
//보기3
//오버로딩 성립O
//두 메서드 모두 int형과 long형 매개변수가 하나씩 선언되어있지만 서로 순서가 다름
int add(int a, long b){return a+b;}
int add(long a, int b) {return a+b;}
}
타입... 변수명 과 같은 형식으로 선언한다
public PrintStream printf(String format, Object... args){
...
}
String concatenate(String s1, String s2) {...}
String concatenate(String s1, String s2, String s3) {...}
String concatenate(String s1, String s2, String s3, String s4) {...}
위 코드를 아래와 같이 대체할 수 있다
String concatenate(String... str) {...}
System.out.println(concatenate()); //인자가 없음
System.out.println(concatenate("a")); //인자가 하나
System.out.println(concatenate("a", "b")); //인자가 둘
System.out.println(concatenate(new String[]{"A", "B"})); //배열도 가능
가변인자는 아래와 같이 매개변수타입을 배열로 하는 것과 어떤 차이가 있을까?
String concatenate(String[] str) {...}
String result = concatenate(new String[0]) //인자를 배열로 지정
String result = concatenate(null) //인자를 null로 지정
String result = concatenate() //에러!! 인자가 필요함
매개변수 타입을 배열로 하면, 반드시 인자를 지정해줘야하기 때문에, 위의 코드에서처럼 인자를 생략할 수 없다. 그래서 null이나 길이가 0인 배열을 인자로 지정해줘야하는 불편함이 있다.