Preface
이번 강의에선 객체 지향 프로그래밍의 정의와 인스턴스의 사용 방법을 공부했다.
이전 영상들에 비해 조금 복잡하고 어려운 내용들이 있어 몇몇 부분은 두 번 이상 돌려보며 고민했다.
자바를 사용하여 코드를 작성하다보니 파이썬에 비해 코드가 전체적으로 복잡하지만, 그만큼 체계적으로 구성된다는 느낌을 받았다.
또, 객체지향이란 개념은 자바의 전체적인 패러다임을 관통하는 강력한 무기가 될 것 같다는 생각이 들었다.
상당히 추상적인 개념이고 다양한 관련 지식을 요하지만, 빠른 시일 내에 내 것으로 만들고싶다.
아 그리고 총 방문자 수가 10000명을 넘어 애드센스를 추가할지 고민중이다.
1. What is Object Oriented Programming?
- 객체 지향 프로그래밍(Object Oriented Programming): 클래스를 중심으로 프로그램의 구조를 만들어가는 컴퓨터 프로그래밍 방법론
- FileWriter: 파일을 다루는 클래스
import java.io.FileWriter;
import java.io.IOException;
public class OthersOOP {
public static void main(String[] args) throws IOException {
FileWriter f1 = new FileWriter("data.txt");
f1.write("Hello");
f1.write(" Java");
f1.close();
}
}
- 긴 맥락을 갖고 작업해야하는 경우엔 클래스를 복제하여 인스턴스를 생성한 후 이를 통해 코드를 제어한다.
- 구분자를 지정하는 코드
public class MyOOP {
public static void main(String[] args) {
delimiter = "----";
printA();
printA();
printB();
printB();
delimiter = "****";
printA();
printA();
printB();
printB();
}
public static String delimiter = "";
public static void printA() {
System.out.println(delimiter);
System.out.println("A");
System.out.println("A");
}
public static void printB() {
System.out.println(delimiter);
System.out.println("B");
System.out.println("B");
}
}
- 클래스를 사용한 구분자 지정 코드
class Print {
public static String delimiter = "";
public static void A() {
System.out.println(delimiter);
System.out.println("A");
System.out.println("A");
}
public static void B() {
System.out.println(delimiter);
System.out.println("B");
System.out.println("B");
}
}
public class MyOOP2 {
public static void main(String[] args) {
Print.delimiter = "----";
Print.A();
Print.A();
Print.B();
Print.B();
Print.delimiter = "****";
Print.A();
Print.A();
Print.B();
Print.B();
}
}
- 컴파일 과정에서 각각의 클래스마다 ".class" 파일이 생성되므로, 여러 개의 파일로 클래스를 분산시켜 코드를 작성할 수도 있다.
→ 클래스 코드를 선택한 후 Refactor, Move Type to New File을 클릭하면 자동으로 분산된 클래스 파일을 생성해준다.
- 메소드의 구분
1) static - class method: 메소드가 클래스 소속일 땐 static 키워드가 있어야 한다.
2) no static - instance method: 메소드가 인스턴스 소속일 땐 static 키워드가 없어야 한다.
- 인스턴스를 사용한 코드
public class MyOOP2 {
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();
}
}
class Print {
public String delimiter = "";
public void A() {
System.out.println(delimiter);
System.out.println("A");
System.out.println("A");
}
public void B() {
System.out.println(delimiter);
System.out.println("B");
System.out.println("B");
}
}
- 클래스와 인스턴스의 관계
1) 인스턴스 내부의 인스턴스 변수 및 메소드 값을 변경해도 원형이 되는 클래스 값에는 영향을 주지 않는다.
→ static이 붙어 있어 값 자체를 지니는 것이 아닌, 클래스의 값을 참조하는 경우엔 값을 변경하면 양측에 모두 반영된다.
- 클래스의 변수를 바꾸면 모든 인스턴스의 변수 값이 바뀐다.
- 인스턴스에서 클래스 변수를 바꾸면 클래스의 변수가 바뀌며, 이를 참조하는 모든 인스턴스의 값도 바뀐다.
- 클래스와 인스턴스의 관계를 보여주는 코드
class Foo {
public static String classVar = "I'm class var";
public String instanceVar = "I'm instance var";
public static void classMethod() {
System.out.println(classVar); // OK
// System.out.println(instanceVar); // Error
}
public void instanceMethod() {
System.out.println(classVar); // OK
System.out.println(instanceVar); // OK
}
}
public class StaticApp {
public static void main(String[] args) {
System.out.println(Foo.classVar); // OK
// System.out.println(Foo.instanceVar); // Error
Foo.classMethod();
// Foo.instanceMethod(); // 인스턴스 소속이므로 클래스를 통해 접근하는 것은 불가능하다
Foo f1 = new Foo();
Foo f2 = new Foo();
System.out.println(f1.classVar); // I'm class var
System.out.println(f1.instanceVar); // I'm instance var
f1.classVar = "changed by f1";
System.out.println(Foo.classVar); // changed by f1
System.out.println(f2.classVar); // changed by f1
f1.instanceVar = "changed by f1";
System.out.println(f1.instanceVar); // changed by f1
System.out.println(f2.instanceVar); // I'm instance var
}
}
- 생성자(constructor): 클래스와 이름이 동일한 메소드로, 클래스가 인스턴스화 될 때 실행(초기화)된다.
1) static, void 등을 지정하지 않는다.
2) this: 클래스가 인스턴스화 되었을 때 해당 인스턴스를 가리키는 이름
public class MyOOP2 {
public static void main(String[] args) {
Print p1 = new Print("----");
p1.A();
p1.A();
p1.B();
p1.B();
Print p2 = new Print("****");
p2.A();
p2.A();
p2.B();
p2.B();
p1.A();
p2.A();
p1.A();
p2.A();
}
}
class Print {
public String delimiter = "";
public Print(String delimiter) {
this.delimiter = delimiter;
}
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");
}
}
- 클래스 내부 변수의 값이 지속적으로 변경되는 경우 해당 클래스를 인스턴스화 하는 것이 좋다.
class Accounting {
public double valueOfSupply;
public static double vatRate = 0.1;
// 생성자
public Accounting(double valueOfSupply) {
this.valueOfSupply = valueOfSupply;
}
public double getVAT() {
return valueOfSupply * vatRate;
}
public double getTotal() {
return valueOfSupply + getVAT();
}
}
public class AccountingApp {
public static void main(String[] args) {
Accounting p1 = new Accounting(10000.0);
Accounting p2 = new Accounting(20000.0);
System.out.println("value Of Supply: " + p1.valueOfSupply);
System.out.println("value Of Supply: " + p2.valueOfSupply);
System.out.println("VAT: " + p1.getVAT());
System.out.println("VAT: " + p2.getVAT());
System.out.println("Total: " + p1.getTotal());
System.out.println("Total: " + p2.getTotal());
}
}
출처: https://www.youtube.com/playlist?list=PLuHgQVnccGMAb-e41kXPSIpmoz1RvHyN4
'Java > 생활코딩' 카테고리의 다른 글
Java 상속 (2) | 2022.09.26 |
---|---|
Java 메소드 (2) | 2022.09.20 |
Java 제어문 (0) | 2022.09.18 |
Java 입문 수업 (4) (2) | 2022.09.15 |
Java 입문 수업 (3) (0) | 2022.09.12 |
댓글