just do it

객체지향(클래스, 인스턴스)(java) 본문

언어&프레임워크/Java

객체지향(클래스, 인스턴스)(java)

밍풀 2022. 8. 21. 20:02

클래스와 인스턴스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.io.FileWriter;
import java.io.IOException;//에러처리
//class filewriter, others, math, system
//instance f1, f2
//method main, floor, ceil, println
public class Others {
 
    public static void main(String[] args) throws IOException {
        
        System.out.println(Math.PI);
        System.out.println(Math.floor(1.1));
        System.out.println(Math.ceil(1.1));//math클래스의 ceil메소드 사용
        
        //위같은건 필요할때마다 가져다 쓰면되, 1회용 같은거, 내부적으로 상태 유지할 필요 없어.
        //쓰는 작업을 여기저기서 하고, 뒤에서도 써서 추가한다던지 복제본은 긴맥락의 작업 해나갈 수 있어
        //일회용은 클래스에 있는거 그대로 사용, 긴맥락 가진 작업은 클래스 직접 사용안하고 복제해서 f1,f2만드는식으로 복제해 제어함 
        
        FileWriter f1= new FileWriter("data.txt");//data txt이름의 파일에 저장하는 상태를 가지고있는 클래스의 복제본 만들어
        f1.write("Hello");
        f1.write(" java");
        f1.close();//hello java기록된 data.txt파일 만들어짐
        
        FileWriter f2= new FileWriter("data2.txt");
        f2.write("Hello");
        f2.write(" java2");
        f2.close();
    
        
 
    }
 
}
 
cs

 

main 메소드 안에서 정의된 매개변수 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
public class myopp {
 
    public static void main(String[] args) {
        
        String delimeter = "-----"//메소드 안에서 정의된 변수는 메소드 안에서만 사용가능
        printA(delimeter);
        printA(delimeter);
        
        delimeter = "*****";
        printB(delimeter);
        printB(delimeter);
  
        
    }
 
    public static void printA(String delimeter) {
        System.out.println(delimeter);
        System.out.println("A");
        System.out.println("A");
    }
    public static void printB(String delimeter) {
        System.out.println(delimeter);
        System.out.println("B");
        System.out.println("B");
    }
 
    
}
 
cs

지역변수는 메소드 안에서만 사용가능하므로, delimeter라는 공통적인 변수가 있음에도 

main 메소드에서 선언된 변수는 printA라는 메소드안에서 쓰일 수 없으므로 계속 언급해줘야 하는 비효율

따라서 delimeter 라는 변수를 전역변수로 지정하는것이 효율적이고, 유지보수 용이

 

매개변수를 전역변수로 지정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
public class myoop {
    
    public static String delimeter;//main메소드 안의 지역변수 아닌, 전역변수로 지정
    public static void main(String[] args) {
        
        delimeter = "-----"
        printA();
        printA();
        
        delimeter = "*****";
        printB();
        printB();
    }
 
    public static void printA() {
        System.out.println(delimeter);//printA바깥에 있는 myoop 클래스에 있는 변수 가져옴
        System.out.println("A");
        System.out.println("A");
    }
    public static void printB() {
        System.out.println(delimeter);
        System.out.println("B");
        System.out.println("B");
    }
 
    
}
 
cs

 

Print 클래스를 만들어 준 것과의 코드 비교

public class에 메소드들이 1억개가 있다고 가정하면 중구난방 뭐가 뭐와 관련된건지 알기 어려워

이점

1. print의 클래스 안에 연관된 변수, 메소드를 넣어놓으면 그것들끼리 연관되었음을 알수 있어

2. print. 을 누르면 에디터가 메소드 추천해주는 것 사용하기도 가능해짐 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class print{
    public static String delimeter;
    public static void A() {
        System.out.println(delimeter); 
        System.out.println("A");
        System.out.println("A");
    }
    public static void B() {
        System.out.println(delimeter);
        System.out.println("B");
        System.out.println("B");
    }
}
public class myoop2 {
    
    public static void main(String[] args) {
        
        print.delimeter = "-----"
        print.A();
        print.A();
        
        print.delimeter = "*****";
        print.B();
        print.B();
    }
 
    
}
 
cs

 

프로그램 실행과정

프로그램 만들때 이름.java 소스코드 만들면

소스코드 이름과 똑같은 클래스를 만드는 것

그 소스코드 컴파일 해서 실행시키면 자바는 소스파일 이름과 똑같은 클래스를 찾아서(클래스 이름 앞 public(접근제어자) 필수) 그 클래스의 메인 메소드를 실행하기로 약속해 있음.

 

클래스 다른 파일로 쪼개기 가능 

파일이름과 똑같은 클래스 앞엔 public 을 붙여야 하며 이는 한번만 등장

하나의 파일에 클래스 여러개 만들면 이클립스는 저장했을때 각각 클래스가 파일로 존재하게 됨.

클래스와 똑같은 이름의 파일 생성하며 클래스 파일 별도로 쪼개기도 가능, 이때 클래스 담은 파일은 부품으로 사용하는 애므로 main메소드가 존재하지 않음.

즉. 기능에 따라 파일로 분산해서 만들 수 있음 이를 리벡터기능 이용해 자동으로 만들기도 가능 

 

 

class 파일 따로만든 후 모습 미리보기, print 이름의 메인메소드 없는 java파일 생성됨