생활코딩 JAVA - 객체 지향 프로그래밍

치즈말랑이·2021년 9월 29일
0

1. 수업소개

method를 다른 언어에서는 function, subroutine, procedural이라한다.

객체를 이용해서 코드의 구조를 세우는 프로그래밍 방법론을 객체지향 프로그래밍이라고 한다.

2. 남의 클래스 & 남의 인스턴스

일회용으로 작업을 끝내는 것들은 클래스에 있는 메소드와 변수를 사용하면 되지만,
긴 맥락을 가진 것들을 작업 하려면 클래스를 직접 사용하는게 아니라 복제본을 만들어서 제어한다.

import java.io.FileWriter;
import java.io.IOException;

public class OthersOOP {

	public static void main(String[] args) throws IOException {

		//class : System, Math, FileWriter
		//instance : f1, f2
		
		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");
		f1.write("Java");
		f1.close();
		
		FileWriter f2 = new FileWriter("data2.txt");
		f2.write("Hello");
		f2.write(" Java2");
		f2.close();
		
		f1.write("!!!");
		f1.close();
	}

}

3. 변수와 메소드


public class MyOOP {
	
	
	public static void main(String[] args) {
		delimiter = "----";
		printA();
		printA();
		printA();
		printA();
		
		delimiter = "****";
		printB();
		printB();
		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");
	}

}

이것은 메소드를 만든 것이다.

4.1. 클래스 - 존재 이유와 기본형식

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 MyOOP {
	
	
	public static void main(String[] args) {
		Print.delimiter = "----";
		Print.A();
		Print.A();
		Print.A();
		Print.A();
		
		Print.delimiter = "****";
		Print.B();
		Print.B();
		Print.B();
		Print.B();
	}

}

PrintA()와 PrintB()를 class Print안에 종속시킴으로서 서로 연관되어 있다는 것을 잘 보여준다.
또한 전체적으로 간결한 느낌이 난다.

4.2. 클래스 - 형식

public : 접근제어자
파일 이름과 똑같은 class 명 앞에는 public을 붙인다.
public은 1번만 등장한다.

클래스 안에 있는 변수와 메소드를 통틀어서 멤버라고 부른다.

Refactor -> Move Type to New File
Type은 데이터 타입이고, class는 데이터 타입과 같은 표현

MyOOP.java

public class MyOOP {
	public static void main(String[] args) {
		Print.delimiter = "----";
		Print.A();
		Print.A();
		Print.A();
		Print.A();
		
		Print.delimiter = "****";
		Print.B();
		Print.B();
		Print.B();
		Print.B();
	}

}

Print.java


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");
	}

}

Print.java는 다른 파일에게 전달해주기 위한 목적이므로 main 메소드와 public을 안쓴다.

5. 인스턴스

여러 상태의 클래스가 동시에 필요할 때는, 클래스 앞에 new를 붙여서 클래스의 복제본을 만들어 서로 다른 상태를 유지할 수 있다.
클래스의 복제본을 인스턴스 라고 한다. 객체 지향의 핵심이다.

My OOP.java

public class MyOOP {
	public static void main(String[] args) {
		
		Print p1 = new Print();
		p1.delimiter="****";
		p1.A();
		p1.A();
		p1.B();
		
		
		
		Print p2 = new Print();
		p2.delimiter="****";
		p2.A();
		p2.A();
		p2.B();
		
		p1.A();
		p2.A();
		p1.A();
		p2.A();`
		
	}

}

Print.java


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");
	}

}

Print.java 클래스 구문에서 static을 지운다.

6. Static

Instance는 Instance를 통해서 사용되도록 고안된 변수다.

Class를 통해서 직접 Instance에 접근하는것은 금지되어 있다.
Instance method에 접근하는 것도 금지되어 있다.

Static은 Class 소속
Static이 없는 것은 Instance 소속이다.

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); //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 class var
		System.out.println(f1.instanceVar); // I 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 instance var
	}

}

7. 생성자와 this

생성자 (constructor) : 초기에 주입할 필요가 있는 값을 전달하거나, 초기에 작업을 수행하도록 쓴다.
클래스와 똑같은 메소드를 정의, static, reutrun data type 등을 지정하지 않는다.
tihs : 생성한 instance를 가리킨다. Class가 instance화 되었을때 instance를 가리키는 특수한 이름이다.

MyOOP.java

public class MyOOP {
	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();
		
	}

}

Print.java


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");
	}

}

8.1. 활용 - 클래스화

class Accounting {
    public static double valueOfSupply;
    public static double vatRate = 0.1;
    public static double getVAT() {
        return valueOfSupply * vatRate;
    }
    public static double getTotal() {
        return valueOfSupply + getVAT();
    }
}    
public class AccountingApp {
    public static void main(String[] args) {
    	Accounting.valueOfSupply = 10000.0;
        System.out.println("Value of supply : " + Accounting.valueOfSupply);
        System.out.println("VAT : " + Accounting.getVAT());
        System.out.println("Total : " + Accounting.getTotal());
 
    }
 
}

class를 따로 만들어서 서로 연관성 있는것을 나타낸다.

8.2. 활용 - 인스턴스화

Instance에 소속된 변수면 static이 빠져야 한다.
static은 class의 소속인데 getVAT() 클래스가 valueOfSupply에 접근할때 어떤 instance의(a1 or a2) valuOfSupply인지 알 수가 없다

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 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());
    	
    }
 
}

static이 잘 이해가 안되서 따로 찾아봤다.
https://wikidocs.net/236

profile
공부일기

0개의 댓글