Backend/JAVA

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

:)jun 2021. 11. 8. 18:28

1. 수업소개

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");
		
		FileWriter f2 = new FileWriter("data2.txt");
		f2.write("Hello");
		f2.write(" JAVA");
		f2.close();
		
		f1.write("!!!");
		f1.close();
		
		
	}

}

 

 

3. 변수와 메소드

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

}

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

코드가 길어지면 유사한 두 메소드의 연관성을 알아보기 힘들게 된다.

클래스로 묶어준다면 사용하기도 편하다. Print. 찍으면 자동완성기능이 따라옴.(이클립스 기준)

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.B();
		Print.B();
		
		
		Print.delimiter = "****";
		Print.A();
		Print.A();
		Print.B();
		Print.B();
	}
}

4.2 클래스 - 형식

클래스 MyOOP, Print 각각 class파일이 만들어진다.

Print 클래스를 별도의 파일로 쪼갤 수 있다. (이클립스에는 Move Type to Few File 기능을 이용할 수 있다.)

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

5. 인스턴스

클래스를 복제한 인스턴스를 만드는 방법 (new)

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

상황에 따라 계속 바꿔줘야하는 상황이 생긴다.

 

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

나의 인스턴스를 만들어보자.

static => 뒤의 변수가 class의 것이라는 말.

인스턴스로 만들어 사용하기 위해서는 static을 지워준다.

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

인스턴스를 여러개를 사용함으로서 중복된 코드를 없앨 수 있다.

 

6. static

인스턴스는 클래스를 원형으로 하기 때문에 여러가지를 복제해 온다.

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(); // OK
//		Foo.instanceMethod(); //error :클래스를 통해서 인스턴스 메소드에 접근 할 수 없다.
	
		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

인스턴스를 생성하는 순간 반드시 처리해야하는 작업이 있을 수 있는데 강요하고 싶을때 생성자를 이용한다.

클래스와 같은 이름의 메소드를 정의하면 그것이 바로 생성자다. (static, return 지정하지 않는다.)

this는 클래스가 인스턴스화 되었을 때는 그 인스턴스를 가리키는 것이다.

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

 

'Backend > JAVA' 카테고리의 다른 글

JUnit Jupiter API (@BeforeEach, @AfterEach)  (0) 2021.11.09
[JAVA] 정규표현식  (0) 2021.10.26
[JAVA] String  (0) 2021.10.26
[JAVA] 문자열 뒤집기 String reverse  (0) 2021.10.25
[JAVA] String <-> int  (0) 2021.10.25