구글에 java Math api 검색하기
자바 API: 자바 개발자가 제공하는 명령어
API 문서: 이런 명령어들의 사용법과 규격을 제공하는 문서
https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html
Math는 java.lang.Object를 상속받는다.
Math가 가지고 있는 메소드는 모두 static한 메소드이다.
-> Math 클래스는 인스턴스를 만들 필요가 없다.
public class MathTest {
public static void main(String[] args) {
int value = Math.abs(-5); // 매개변수로 받은 값을 절댓값으로 변환해 리턴
System.out.println(value);
}
}
5
Math m = new Math();
왜? Math 클래스는 static 메소드 뿐이니까 인스턴스를 생성할 필요가 없는데, 인스턴스를 만들게 되면 heap 메모리 영역이 낭비되기 때문이다. 그래서 인스턴스 생성을 막은 것이다.
public class MyMath {
public static int abs(int x){
if( x < 0)
return x * -1;
else
return x;
}
}
public class MyMathMain {
public static void main(String[] args) {
int value = MyMath.abs(-5);
System.out.println(value);
}
}
5
MyMath m = new MyMath();
자동으로 생성자가 만들어졌기 때문에 new MyMath() 코드가 컴파일 오류가 발생하지 않는다.
MyMath() 는 생성자이다.
MyMath 클래스가 다음과 같은 생성자를 하나도 생성하지 않는다면 컴파일 시 자동으로 기본 생성자가 만들어진다.
public static int abs(int x) {
if( x > 0 )
return x * -1;
else
return x;
}
기본 생성자는 public MyMath() {}와 같다. ( 반환하지 않고, 생성자명 = 클래스명 )
아무것도 하지 않는 기본 생성자가 컴파일 시 만들어지는 것이다.
public 은 접근 제어자로 어디서든 접근할 수 있다.
기본 생성자인 public MyMath() {}를 private MyMath() {}로 바꾼다면
MyMath m = new MyMath();
에러가 발생한다. -> 인스턴스를 생성하지 못한다.
-> 인스턴스를 생성하지 못하므로 MyMath클래스는 인스턴스 메소드를 호출하지 못한다.
즉, 인스턴스를 생성 못하면 static이 없는 메소드는 생성을 못해 사용할 수가 없다.