계산기 프로그램을 자바 코드로 구현했을 때,
계산할 것이 많아질수록 클래스를 추가하는 것이 아닌
아래와 같이 ca1, ca2를 생성하여 각 역할을 수행하게 한다.
ca1, cal2와 같은 것을 객체라고 한다.Calculator cal1 = new Calculator(); // 계산기1 객체를 생성한다. Calculator cal2 = new Calculator(); // 계산기2 객체를 생성한다.
new
는 객체를 생성할 때 사용하는 키워드다.class Animal {
}
public class Sample {
public static void main(String[] args) {
Animal cat = new Animal();
Animal dog = new Animal();
Animal horse = new Animal();
}
}
class Animal {
String name;
}
public class Sample {
public static void main(String[] args) {
Animal cat = new Animal();
System.out.println(cat.name);
}
}
// null
class Animal {
String name;
public void setName(String name) {
this.name = name;
}
}
public class Sample {
public static void main(String[] args) {
Animal cat = new Animal();
cat.setName("야옹이");
System.out.println(cat.name);
}
}
// 야옹이
Animal cat = new Animal();
cat.setName("야옹이");
Animal dog = new Animal();
dog.setName("멍멍이");
클래스에 의해! 생성된 것은
객체
클래스에 선언! 된 것은
객체 변수
객체에 값을 대입!
메서드
믹서기에 과일을 넣고 간다면
-> 과일은 입력
-> 과일 주스는 출력(return)
-> 믹서기는 메서드
public class Sample {
int sum(int a, int b) {
return a + b;
}
public static void main(String[] args) {
int a = 3;
int b = 4;
Sample sample = new Sample();
int c = sample.sum(a,b);
System.out.println(c);
}
}
// 7
public class Sample {
int sum(int a, int b) { // a와 b는 매개변수
return a + b;
}
public static void main(String[] args) {
Sample sample = new Sample();
int c = sample.sum(3,4); // 3과 4는 인수
System.out.println(c);
}
}
매개변수
메서드에 전달된 값을 저장하는 변수
인수
메서드에 전달하는 값
소주병 == 매개변수
| 소주 == 인수
입력값 -> 메서드(블랙박스) -> 리턴값
리턴자료형 메서드명 (입력자료형1 매개변수1, 입력자료형2 매개변수2, ...) {
....
return 리턴값
}
// 리턴자료형이 void라면 return문 노필요
리턴값 받을 변수 = 객체.메서드명(입력인수1, 2 ...)
...
int sum(int a, int b) {
return a+b;
}
...
Sample sample = new Sample();
int result = sample.sum(3, 4);
리턴값 받을 변수 = 객체.메서드명()
...
String say() {
return "Hi";
...
Sample sample = new Sample();
String a = sample.say();
System.out.println(a); // "Hi" 출력
}
객체.메서드명(입력인수1, 2, ...)
...
void sum(int a, int b) {
System.out.println(a+"과 "+b+"의 합은 "+(a+b)+"입니다.");
...
Sample sample = new Sample();
sample.sum(3, 4);
// 3과 4의 합은 7입니다.
...
void say() {
System.out.println("Hi");
}
...
Sample sample = new Sample();
sample.say();
// Hi
정리해보자면
입력값이 있을 땐 입력 인수를 적고,
리턴값이 있을 땐 리턴값을 받을 변수를 적는다.
void sayNick(String nick) {
if ("fool".equals(nick)) {
return;
}
System.out.println("나의 별명은 "+nick+" 입니다.");
}
this 활용
void varTest(Sample sample) { sample.a++; } == void varTest() { this.a++; }
class Updater {
void update(int count) {
count++;
}
}
class Counter {
int count = 0; // 객체변수
}
public class Sample {
public static void main(String[] args) {
Counter myCounter = new Counter();
System.out.println("before update:"+myCounter.count);
Updater myUpdater = new Updater();
myUpdater.update(myCounter.count);
System.out.println("after update:"+myCounter.count);
}
}
// before update:0
// after update:0
// 입력값 변경
...
void update(Counter counter) {
counter.count++;
}
...
myUpdater.update(myCounter); // 객체 전달 받음
System.out.println("after update:"+myCounter.count);
// after update:1
메서드 입력으로 객체 전달 받는 경우, 메서드가 입력받은 객체 그대로 사용하기 때문에 메서드가 객체의 속성값을 변경하면 메서드 수행 후에도 객체의 변경된 속성 값이 유지된다.