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 |