개발/Java

☕Java:: {OOP(Object Oriented Programming, 객체 지향 프로그래밍) - 클래스 & 인스턴스} rough note

hyuunii 2022. 9. 4. 19:24

OOP - 1 수업의 지향점

* 메쏘드만으로 프로그램을 만드는 데 부족함을 느낌. 그래서 서로 연관된 변수들과 메쏘드를 모아 그룹핑하고 이름을 붙인 수납상자가 class! 클래스를 중심으로 프로그램의 구조를 만들어가는 컴퓨터 프로그래밍 방법론을 객체 지향 프로그래밍, 언어 차원에서는 객체 지향 언어라고 함(편협한 정의나 초심자가 이해하기에 유용함!)

* 현대 프로그래밍 언어를 받치는 기둥인 '객체지향'!!! 코드를 깔끔하게 정리정돈하기 & 분신술이라는 '인스턴스' & 부모 클래스를 자식에게 물려주는 '상속' & 클래스의 설계도인 '인터페이스'와 같은 다양한 현대 프로그래밍 언어들의 기능을 받아들일 수 있는 베이스를 갖추게 될 것!


OOP - 2 남의 클래스 & 남의 인스턴스

클래스: 서로 연관된, 같은 주제를 가진 변수와 메쏘드를 그룹핑한 껍데기

* 수학과 관련된 것들이 정리된 수납(클래스)? Math. 얘는 Math.~이렇게 그냥 클래스를 바로 사용해 줌. 왜냐면 내부적으로 어떤 상태를 유지할 필요가 없거덩. 걍 필요할 때 일회용으로 써주는 것.

System.out.println(Math.PI);

Math라는 클래스PI라는 변수가 있고, 걔는 3.14~~~~라는 숫자가 적혀 있음.

System.out.println(Math.ceil(1.3));

Math라는 클래스ceil이라는 메쏘드가 있고, 걔는 올림 하는 함수.

* FileWriter은 Math처럼 똑같은 '클래스'이긴 한데, 앞에 new를 붙여서 변수에 담기는 복제본을 만들어 주고 그 복제본은 내부적으로 data.txt파일에 내용을 저장하겠다는 상태를 가지고 있음. 얘는 맥락을 길게 사용할 수 있어서 좀 복잡한 복제 등등을 이용해 제어함.

FileWriter f1 = new FileWriter("data.txt");

data.txt에다가 파일을 저장하겠다는 상태를 가진 FileWriter 클래스의 복제본을 만들 것. 그걸 f1이라는 변수에 담고, 그 복제본의 데이터 타입은 클래스 이름인 FileWriter임.

f1.write("Hello!");

f1.write(" Java");

FileWriter f2 = new FileWriter("data2.txt");

f2.write("Hello!");

f2.write(" Java");

f2.close();

f1.write("! Happily Ever After~~~~!");

f1.close();

}

위의 코드에서

class : System, Math, FileWriter

instance : f1, f2 (각각의 두 개에 담겨 가리키는 값이 인스턴스~!)


OOP - 3 Variables & Method / 변수 & 메쏘드

class Print{
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 MyOOP {
public static String delimiter = "";
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();
}
}

public static String delimiter = "";가 의아했는데

위의 delimiter = "----";과 delimiter = "****";를 주석 처리 후

public static String delimiter = "❤❤";라고 하니까

❤❤

A

A

❤❤

A

A

❤❤

B

라고 나오는 걸 보니 대충 이해가 감


OOP - 4 Class / 클래스; 클래스의 존재 이유와 기반

'이름이름'이라는 클래스에 소속된 A와 B 메쏘드로 변경해주기?!

ㅋㅋㅋㅋㅋㅋㅋ

↳print라는 클래스로 만들어주려니까 뭔가.. 원래부터 있던 print라는 클래스를 끌고 와서 쓰는 것 같은데 그게 아니라 완전 내가 걍 혼자서 임의로(ㅎ...) 만들어주는거라 정말 아무 이름이나 붙인거임ㅋ

코드
출력값
class 이름이름{
public static String delimiter = "";
public static void A() {
}
public static void B() {
}
}
public class myOOP {
public static void main(String[] args) {
이름이름.delimiter = "----";
이름이름.B();
이름이름.B();
이름이름.A();
이름이름.A();
이름이름.delimiter = "****";
이름이름.A();
이름이름.A();
이름이름.B();
이름이름.B();
}
}
 
----
B
B
----
B
B
----
A
A
----
A
A
****
A
A
****
A
A
****
B
B
****
B
B

이거 겁나 헷갈리는데, 뭐냐면.

일단 이름이름이라는 class부터 선언을 해 줬잖아? 얘는 정체가 뭐냐면 A()라는 메쏘드를 만나면 delimiter-A-A를 차례로 인출 및 B()라는 메쏘드를 만나면 delimiter-B-B를 차례로 인출함.

그 후 메인 메쏘드에서 class이름이름을 계속 불러와서 차례로 "----"라는 delimiter-B-B-A-A-"****"라는 delimiter-A-A-B-B를 요구함~! 그러므로 출력값이 저렇게 나오는 것.


OOP - 5 Instance / 인스턴스; 인스턴스의 개념 및 작성 방법

개괄) 여러 상태의 클래스가 동시에 필요할 때, 클래스 앞에 new를 붙여서 클래스의 클론 즉 인스턴스를 만들어 서로 다른 상태를 유지할 수 있음.

비유) 클래스: 붕어빵 틀, 인스턴스: 붕어빵, static: 붕어빵 구울 준비 완/미완 & 앱: 회사, class A: A 직무를 하는 최초의 직원. →회사가 커지면서 직원들의 업무량 증가로 업무 마비가 옴. 회사에서 A 직무를 똑같이 수행할 직원(인스턴스)를 고용해 줌.. 최초 직원은 승진해서 새로 고용된 직원들이 같은 일을 하도록 가이드만 주게 되고, 새로 고용된 직원들은 이에 따라 업무를 분장받아 효율적인 일처리를 하게 됨. 변동 사항이 있을 때 일일이 데이터를 변경하지 않고 최초의 클래스에게만 알려주어 인스턴스에 공통 반영하던지, 또는 새로운 인스턴스를 만들어 반영 및 작업의 강도를 줄일 수 있음.

변경 전
변경 후(인스턴스 도입)
class 이름이름{
public static String delimiter = "";
public static void A() {
}
public static void B() {
}
}
public class myOOP {
public static void main(String[] args) {
이름이름.delimiter = "----";
이름이름.B();
이름이름.B();
이름이름.A();
이름이름.A();
이름이름.delimiter = "****";
이름이름.A();
이름이름.A();
이름이름.B();
이름이름.B();
}
}
 
public class myOOP {
public static void main(String[] args) {
이름이름 p1 = new 이름이름();
p1.delimiter = "----";
p1.A();
p1.A();
p1.B();
p1.B();
이름이름 p2 = new 이름이름();
p2.delimiter = "****";
p2.B();
p2.B();
p2.A();
p2.A();
 
p1.B();
p2.A();
p1.B();
p2.A();
}
}
 
public class 이름이름 {
public String delimiter = "";
public void A() {
}
public void B() {
}
}