2022년 2월 28일 월요일
오전 11:17
남의 클래스 & 남의 인스턴스
new를 붙임으로 인해서 "data.txt"라는 곳에 파일을 저장하겠다고 하는 상태를 가진 FileWriter라는 class의 복제본이 된다. 복제본의 DataType은 class이름인 FileWriter타입이다
Ø 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(" JAVA");
f2.close();
//class : system, Math, FileWriter...etc
//instance : f1, f2
변수와 메소드
무수히 반복되는 코드를 Refactor>Extract Method를 통해 이름을 설정해주면 간편하게 바뀐다.
Ø System.out.println("_구분-");
System.out.println("A");을 pirntA로 설정하면
Ø printA();
이렇게 출력이 된다.
Delimiter(인자)를 이용해 변수를 줄 수 있다.
public static void printA() {
System.out.println("구분");
System.out.println("A");
이것이 Refactor를 이용해 method를 만들어주는 코드인데
Delimiter를 설정하고 입력해서 값을 변경할 수 있게 해준다.
public static void printA(String delimiter) {
System.out.println(delimiter);
System.out.println("A");
이런식으로 코드를 변경해준 후
String delimiter = "----"
printA(delimiter);
이렇게 설정하면 해당 코드에서는 인자가 "----"으로 설정돼서 출력되고 다른 줄에서 delimiter를 변경하면 변경된 값으로 출력돼서 일일이 refacter를 설정하거나 다른 코드를 변경할 필요가 없게 된다.
존재 이유와 기본형식
Ø class Print{
public static String delimiter = "";
public static void A() {
System.out.println(delimiter);
System.out.println("A");
}
public static void B() {
System.out.println(delimiter);
System.out.println("B");
}
}
이렇게 Class를 생성할 수 있다. Print라는 class를 생성 후 그 안에 method들을 집어 넣어서 Print.만 해도 바로 연관된 변수나 Method 튀어나올 수 있게 만들어 준 것이다.
형식
특정 class안에 class가 하나 더 생성하면 public class가 아닌 class는 따로 class를 파일 안에 생성하게 된다.
Tip. Ex) 특정 Class를 Refactor> move type to new file을 누르면
public class를 생성하는 java에 있던 그 특정 class의 .java를 새로 생성하게 되면 기존 .java에서 그 코드들을 움직이게 할 수 있다.
Instance
Class에 new를 붙여 내부 상태를 지정해서 편하게 만드는 건데 하도 많이 썼으니 패스!!!
냉장고 비유는 꽤 재밌었음
Static
Ø class Foo{ //여기에 두개의 변수를 만들건데
public static String classVar = "I class Var";
public String instanceVar = "I instance Var";
public static void classMethod() {
System.out.println(classVar);
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(); //error 접근이 안됨. 인스턴스 소속이기에 class를 통해 접근하는게 x
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"; //f1의 classVar은 static이기에 class Foo의 class var이다
System.out.println(Foo.classVar); // changed by f1
System.out.println(f2.classVar); //f2의 classVar 역시 class Foo의 classVar인데 상기 작업으로 인해 값이 변화했기에 값이 바뀔것이다.
f1.instanceVar = "changed by f1";
System.out.println(f1.instanceVar); //changed by f1
System.out.println(f2.instanceVar); //독립적으로 운용되는 인스턴스기에 위처럼 바뀌어도 영향을 받지 않음.
}
}
생성자와 this
생성자: 초기에 주입할 필요가 있는 데이터 값, 초기에 작업을 수행하도록 할때 하는거.
this. 내가 생한 instance를 가르키는 이름
Ø class Print {
public String delimiter = "";
public Print (String delimiter) {
this.delimiter = delimiter;
}
public void A() {
System.out.println(this.delimiter);
System.out.println("A");
}
}
this.delimiter의 delimiter는 생성자 Method delimiter의 매개변수이다.
Print p1 = new Print("----");일때
P1.A();는 ---- / A가 나오는데 그 과정을 이해하는게 중요