[JAVA] 자바 객체 지향 프로그래밍 (OOP)
생활코딩 강의 정리
JAVA: 객체 지향 프로그래밍 (OOP)
이 글은 아래의 강의를 보고 작성한 포스트 입니다.
1. 남의 클래스 & 남의 인스턴스
Math 클래스
- PI 변수
- floor()
- ceil()
FileWriter 클래스
- write()
- close()
실습 코드
package others;
import java.io.FileWriter;
import java.io.IOException;
public class OthersOOP {
public static void main(String[] args) throws IOException { //예외처리
System.out.println(Math.PI);
System.out.println(Math.floor(1.8)); //내림
System.out.println(Math.ceil(1.8)); //올림
FileWriter f1 = new FileWriter("data.txt");
f1.write("hello world");
f1.close();
FileWriter f2 = new FileWriter("data2.txt");
f2.write("hello world");
f2.close();
}
}
-
Math의 PI와 floor는 일회성으로 이용, 내부 상태를 계속 유지할 필요가 없음
-> 메소드나 변수를 클래스에 있는 그대로 사용
-
FileWriter의 write는 내부 상태를 계속 유지해야 함.
-> 클래스의 복제본을 만들어서 메소드나 변수를 사용
2. 클래스와 인스턴스
클래스
- 객체를 정의한 틀
- 객체를 만들기 위한 설계도 역할
- 객체가 가져야 할 속성(필드)과 기능(메서드)을 미리 정의해 놓은 추상적 개념
인스턴스
- 클래스라는 설계도를 바탕으로 만들어진 실제 객체
- 클래스는 추상적이며 실제 메모리에 할당되지 않음. 인스턴스는 new 연산자를 통해 메모리에 생성되어 프로그램 내에서 동작하는 구체적인 존재
예시
클래스가 ‘사람’이라면 인스턴스는 ‘홍길동’이라는 사람
생성자와 this
- 생성자: 클래스와 똑같은 이름의 메소드를 정의한 것
- 자바는 생성자가 있으면 이를 먼저 호출함
-
가장 먼저 실행해야하는 코드를 생성자에 넣음
- this: 현재 있는 인스턴스를 가리킴
실습코드
package others;
public class MyOOP {
public static void main(String[] args) {
Print p1 = new Print("----");
// p1.delimiter = "----";
p1.A();
p1.A();
p1.B();
p1.B();
Print p2 = new Print("****");
// p2.delimiter = "****";
p2.A();
p2.A();
p2.B();
p2.B();
p1.A();
p2.A();
p1.A();
p2.A();
}
}
package others;
class Print{
public String delimiter = "";
// 생성자(초기필수작업)
public Print(String delimiter){
this.delimiter = delimiter;
} // this : 현재 인스턴스
public void A() {
System.out.println(this.delimiter);
System.out.println("A");
System.out.println("A");
}
public void B() {
System.out.println(this.delimiter);
System.out.println("B");
System.out.println("B");
}
}
3. static
클래스 변수와 인스턴스 변수
- 클래스 변수를 바꾸면 클래스 변수를 공유하는 인스턴스 변수도 바뀐다.
실습코드
package staticTest;
class Foo {
public static String classVar = "I class var";//클래스 변수
public String instanceVar = "I instance Var"; //인스턴스 변수
public static void classMethod() { //클래스 메소드
System.out.println(classVar); //OK
// System.out.println(instanceVar); //Error
}
public void instanceMethod() { //인스턴스 메소드
System.out.println(classVar);
System.out.println(instanceVar);
}
}
public class StaticApp {
public static void main(String[] args) {
System.out.println(Foo.classVar);
// System.out.println(Foo.instanceVar); //Error
Foo.classMethod();
// Foo.instanceMethod(); //Error
Foo f1 = new Foo();
Foo f2 = new Foo();
System.out.println(f1.classVar);
System.out.println(f1.instanceVar);
f1.classVar ="changed by f1";
System.out.println(Foo.classVar);
System.out.println(f2.classVar);
f1.instanceVar ="changed by f1";
System.out.println(f1.instanceVar);
System.out.println(f2.instanceVar);
}
}
4. 활용
부가가치세를 계산하는 프로그램
실습코드
package review;
// 클레스화
class Accounting{ // 부가가치세와 관련된 변수/메소드만 존재
// 공급가액
public double valueOfSupply;
public Accounting(double valueOfSupply){ // 부가가치세를 받아옴
this.valueOfSupply = valueOfSupply;
}
// 부가가치세율
public static double vatRate = 0.1; // 변경될 일이 없음. static으로 두기.
public double getVAT() { // 부가가치세 계산
return this.valueOfSupply * vatRate;
}
public double getTotal() { // 총 금액
return this.valueOfSupply + getVAT();
}
}
public class AccountingApp { // 메인
public static void main(String[] args) {
Accounting a1 = new Accounting(10000.0); // 인스턴스화
Accounting a2 = new Accounting(20000.0);
System.out.println("Value of supply : " + a1.valueOfSupply);
System.out.println("Value of supply : " + a2.valueOfSupply);
System.out.println("VAT : " + a1.getVAT());
System.out.println("VAT : " + a2.getVAT());
System.out.println("Total : " + a1.getTotal());
System.out.println("Total : " + a2.getTotal());
}
}
댓글남기기