본문 바로가기
Java/생활코딩

Java 객체 지향 프로그래밍

by k-mozzi 2022. 9. 25.
반응형
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 객체지향 프로그래밍

 

www.youtube.com

 

728x90
반응형

'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

댓글