Day 21 (23.01.25)

Jane·2023년 1월 25일
0

IT 수업 정리

목록 보기
21/124

1. 라이브러리 파일 안의 클래스 확인해보기

1-1. Math 라이브러리 파일

  • JRE System Library 파일 > Math 클래스 (일부분)
  • 변하지 않는 수이기도 하고, 보편화된 수이므로, 이미 JVM에 저장되어 지원해준다. (일일히 우리가 타이핑하지 않아도 되는 번거로움을 줄일 수 있다.)
public final class Math {

    private Math() {}

    public static final double E = 2.7182818284590452354;

    public static final double PI = 3.14159265358979323846;

    private static final double DEGREES_TO_RADIANS = 0.017453292519943295;

    private static final double RADIANS_TO_DEGREES = 57.29577951308232;
    
}

예시 ] Math 라이브러리를 이용하여 PI를 출력하는 코드

public class Hello {

	public static void main(String[] args) {
		System.out.println(Math.PI);
	}

}

[Console]
3.141592653589793

1-2. System 라이브러리 파일

  • System 클래스 > out
  • PrintStream 클래스 > print, println
public final class System {
 private System() {
    }
 public static final PrintStream out = null;

}


public class PrintStream extends FilterOutputStream
    implements Appendable, Closeable
{
   public void print(boolean b) {
        write(String.valueOf(b));
    }

    public void print(char c) {
        write(String.valueOf(c));
    }

    public void print(int i) {
        write(String.valueOf(i));
    }

    public void print(long l) {
        write(String.valueOf(l));
    }

 
    public void print(float f) {
        write(String.valueOf(f));
    }

  
    public void print(double d) {
        write(String.valueOf(d));
    }


    public void print(char s[]) {
        write(s);
    }

 public void println() {
        newLine();
    }


    public void println(boolean x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

   
    public void println(char x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(int x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

  
    public void println(long x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

  
    public void println(float x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }


    public void println(double x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }


    public void println(char x[]) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

  
    public void println(String x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    
}

2. 클래스 메소드의 정의와 호출

  • 함수 앞에도 static을 붙일 수 있다.

2-1. 예제 코드

class NumberPrinter {
	private int myNum = 0;
	static void showInt(int n) {
		System.out.println(n);
	}
	
	static void showDouble(double n) {
		System.out.println(n);
	}
	
	void setMyNumber(int n) { myNum = n; }
	void showMyNumber() { showInt(myNum); }
    // 일반적인 함수도 클래스 함수(static 함수)를 호출할 수 있다. 
}

public class ClassMethod {

	public static void main(String[] args) {
       NumberPrinter.showInt(20);
       // static이 붙으면 class의 이름을 대고 바로 접근하여 호출할 수 있다.
       
       NumberPrinter np = new NumberPrinter(); // 객체 생성
       np.showDouble(3.15);
       // 객체를 생성하여 static 함수에 접근하기
       
       np.setMyNumber(75);
       np.showMyNumber();
	}
}

2-2. static 함수 안에서 오류가 발생하는 이유

  • static 함수에 인스턴스 변수, 인스턴스 함수가 올 수 없다.
    (static 함수는 인스턴스 함수에서 자유롭게 호출해서 쓸 수 있다.)
  • static은 스캔할 때 메모리가 인식을 하게 되고, 일반적인 변수/함수는 객체를 생성할 때 메모리에 올려진다. (메모리에 올라가는 순서가 다르다)
  • 인스턴스 변수인 myNum, 인스턴스 함수인 showMyNumber()는 static으로 할당되어 있지 않은 상태이므로 오류를 표시하게 된다.
  • 인스턴스 변수/함수 앞에 static을 넣어주면 오류가 없어진다.

2-3. static 함수의 활용

  • static을 사용하지 않아도 프로그램은 돌아간다.
    그러나 static을 적재적소에 활용하면 메모리 사용을 효율적으로 할 수 있다.
  • static을 선언하지 않게 된다면 사용할 때마다 계속 객체를 생성해야 한다.

PrintStream out = new PrintStream();
out.print(text);

System.out.print(text);

  • static을 선언한 함수는 직접 접근해서 사용할 수 있다.
  • static 변수를 제어하기 위해서는 static 함수를 사용한다.
    (인스턴스 변수를 사용하면 오류 발생)
class SimpleCalculator {
	static final double PI = 3.1415; // 파이 값

	static double add(double n1, double n2) {
		return n1 + n2;
	} // 더하기 함수

	static double min(double n1, double n2) {
		return n1 - n2;
	} // 빼기 함수

	static double calCircleArea(double r) {
		return PI * r * r;
	} // 원의 넓이 구하기 함수

	static double calCirclePeri(double r) {
		return PI * (r * 2);
	} // 원의 둘레 구하기 함수

}

3. main 함수에 대한 고찰

  • static : main은 인스턴스 생성과 관계 없이 제일 먼저 호출되는 메소드이다.
  • public : main은 외부에서 시작하는 명령이다.
  • main 함수도 static 함수이므로, 인스턴스 변수/함수는 접근할 수 없다.

class Car {
	int a;
	static int b;
    
	Car(){
		System.out.println("Car 생성?");
	}
	
	void myCar() {
		System.out.println("This is my car.");
	}

	public static void main(String[] args) {
		myCar(); // 오류 
		Car car = new Car(); // 오류 X
		
		System.out.println(a); // 오류
		System.out.println(b); // 오류 X
	}
}
  • 자신의 클래스 안에서도 자신의 이름과 같은 객체 생성이 가능한가?
    • (클래스로 인식하기보다는) 데이터 타입으로 인식하고, 데이터 타입-데이터 멤버로 연관시켜야 한다.
    • 데이터 타입을 가진 객체를 생성한 다음, 자신이 갖고 있는 주소를 넘겨준다.

4. main 함수(static) 예제

class A {
	static int a = 0;
	static B b = new B(); // b 객체 생성
    // static 없으면 main(static 함수)에서 오류 발생
}

class B {
	void print() {
		System.out.println("Test"); // b.print는 Test 출력
	}
}

class ClassMethod {
	public static void main(String[] args) {
		System.out.println(A.a);
		A.b.print();
	}
}

  • Java 메모리 영역에 들어가는 정보 : Method Area, Call Stack, Heap ...
profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글