절차지향 | 객체지향 |
---|---|
시작과 끝이 정해져 있고, 모든 과정이 순서대로 진행되어야 한다. 어느 한 순서에서 오류가 나면 그 이후로는 전체가 마비 된다. | 순서와 상관없이 각 "객체가 독립적으로 사용"되며 하나의 객체가 오류가 나도 다른 객체에 영향을 끼치지 않는다. |
class Calculator {
int result = 0;
int add (int num){
result += num;
return result;
}
}
// 계산기를 더 만들기 위해 클래스를 또 만들 필요가 없다.
//class Calculator2 {
// int result = 0;
//
// int add(int num){
// result += num;
// return result;
// }
//}
public class ObjectOrientedProgram {
public static void main (String[]args) {
Calculator cal1 = new Calculator (); // 계산기 1객체를 생성
Calculator cal2 = new Calculator (); // 계산기 2객체를 생성
// 계산기 1에서는
System.out.println(cal1.add(3)); // 3을 출력
System.out.println(cal1.add(4)); // 7을 출력
// 계산기 2에서는
System.out.println(cal2.add(3)); // 3을 출력
System.out.println(cal2.add(7)); // 10을 출력
}
}
각각의 객체는 다른 객체의 결과값과 상관없이 독립적인 값을 유지한다. 이렇게 추가적인 클래스를 생성할 필요가 없이 다른 독립적인 객체를 생성만 해도 되는 것이 객체지향 프로그램의 가장 큰 장점이다.
class Animal{
String name;
Animal 이라는 클래스는 name이라는 속성을 가지고 있는데 클래스에 선언된 변수를 객체변수(인스턴스 변수, 멤버 변수, 속성)라 한다.
public void setName(String name){
this.name = name;
}
}
Animal 클래스에 의해 생성된 객체는 이 name이라는 변수를 가질 수 있다 (this는 Animal클래스에 의해 생성된 객체를 지칭). 즉, Animal 클래스는 자신의 객체에게 name이라는 속성을 붙여주는 "틀"이다.
public class Class{
public static void main(String[]args){
Animal cat = new Animal();
cat.setName("boby");
System.out.println(cat.name);
}
}
Animal 클래스에서 cat 객체를 생성(cat은 Animal의 인스턴스)하여 cat 객체에게 "boby"라는 name을 부여할 수 있다. 즉, 객체는 틀에 의해 만들어진 결과물이다.
cat.setName("boby")
가 해석되는 순서
: setName의 입력값 name에는 "boby"라는 문자열이 전달(this.name = "boby";)
-> this는 Animal 클래스의 객체를 지칭
-> 따라서 this가 cat으로 바뀌어서 cat.name = "boby"
System.out.println(cat.name)
: boby가 출력된다.
public class Method{
// 입력값과 리턴값이 있는 메소드
int sum1(int a, int b) {
return a + b;
}
// 입력값이 없고 리턴값만 있는 메소드
String say1() {
return "Hi";
}
// 입력값이 있고 리턴값이 없는 메소드
void sum2(int a, int b) {
System.out.println(a+"과 "+b+"의 합은 "+(a+b)+"입니다.");
}
// 입력값도 리턴값도 없는 메소드
void say2() {
System.out.println("Hi");
}
}
Java는 객체지향 언어이며 이는 우리가 살고 있는 세계를 모델링한 것이다. 우리 세계에 살고 있는 각 개개인(객체)은 자신만의 정체성을 갖고있다. 그렇기 때문에 Java의 객체도 생성될 때마다 특성을 부여해줘야 하는데 그 특성을 부여하는 행위를 "초기화"한다 라고 부른다.
class HouseDog {
String name;
void setName(String name) {
this.name = name;
HouseDog(String name) {
}
}
}
HouseDog(String name)
: (매개변수) 생성자
생성자는 메소드명이 클래스명과 동일하고 리턴 자료형을 정의하지 않는다. 해당 생성자는 name이라는 문자열을 HouseDog 클래스의 객체에게 초기값으로 부여하는 생성자이다. 다시 말하면, 생성자는 클래스의 인스턴스에게 객체변수 값을 무조건 설정해야만 해당 객체가 생성될 수 있도록 강제시키는 메소드이다.
class WildDog {
WildDog() {
}
}
WildDog()
: 기본(디폴트) 생성자
생성자의 입력 항목이 없고 생성자 내부에 아무 내용이 없는 생성자를 디폴트 생성자라고 부른다. 객체가 생성될 때 만약 생성자가 없다면 자동으로 디폴트 생성자가 만들어진다. 즉, 디폴트 생성자는 클래스의 객체가 만들어 질 때 실행되며 초기값은 없다.
만약 클래스에 (매개변수) 생성자가 하나도 없다면 컴파일러는 자동으로 디폴트 생성자를 추가한다. 하지만 사용자가 작성한 (매개변수) 생성자가 하나라도 있다면 컴파일러는 디폴트 생성자를 자동으로 추가하지 않는다.
public class Constructor{
public static void main(String[]args) {
HouseDog houseDog = new HouseDog("happy");
}
}
그렇기 때문에 HouseDog 클래스에 문자열 name을 입력으로 받는 생성자 HouseDog(String name)
를 만든 후에는 곧 바로 초기값이 없는 객체(new HouseDog()
)를 만들 수 없다. 왜냐하면 HouseDog 클래스에 이미 생성자를 만들었기 때문에 컴파일러는 디폴트 생성자를 자동으로 추가하지 않기 때문이다.
만약 HouseDog houseDog = new HouseDog()
와 같은 방식으로 객체를 생성하고 싶다면 디폴트 생성자를 생성하면 된다.