math : java가 제공해주는 클래스
사용하려면 API를 봐야 한다.
field : static double
method : 엄청 많음.
static이 붙어있다? : 인스턴스를 만들 필요가 없다. 필드와 메소드 모두 static하기 때문이다. 모든 메소드에 static이 붙어있다. 따라서 math 클래스 사용할 때는 인스턴스를 만들면 안된다.
만약에 클래스 안에 아무런 메소드를 쓰지 않으면
public 클래스명(){} 라는 생성자가 컴파일할 때 자동으로 만들어진다.
그러나, 만약 해당 클래스 내부 외에 다른 클래스에서 인스턴스를 못 만들게 하려면 생성자를 private으로 만들면 된다. private 클래스명(){}
Math클래스를 만든 사람은 메모리를 절약할 수 있도록 만든것.
클래스 메소드 vs 인스턴스 메소드
- static이 붙어있는 메소드 : 클래스 메소드, 아닌 것 : 인스턴스 메소드
- 인스턴스 별로 다르게 동작해야 한다면 인스턴스 메소드
- static메소드는 객체 생성이나 유틸리티 관련에서 사용될 때가 있다.
- 되도록 인스턴스 메소드를 사용한다.
필드
- 클래스가 가지는 속성 (자바)
- 다른 언어에서는 멤버 변수라고 말 하는 경우도 있다(c?)
- 사람에 대한 설계도가 있다면, 태어난 날짜, 이름 등의 정보를 필드라고 한다.
- 필드는 어떤 키워드와 함께 사용하느냐에 따라서 사용법이 달라진다.
- static이라는 키워드가 함께 사용되는 필드는 클래스 필드, 함께 사용되지 않는 필드는 인스턴스 필드라고 한다.
필드 선언 방법
[접근제한자][static][final]타입 필드명[=초기값]
- 대괄호 - 생략 가능
- 접근 제한자 : public, protected, 아무것도 없는 경우 default, private
- 필드명은 식별자규칙을 따른다. 다만 첫번째 글자는 소눔자
- 타입은 기본형과 참조타입(class, interface,배열)
- 초기값이 없을 경우에는 참조형일 경우 : null, boolean형일 경우 false, 나머지 기본형은 모두 0으로 초기화 \
String name;
String address = "경기도 고양시";
public int age = 50;
protected boolean flag;
string은 참조타입, 지금은 참조하는 게 없어서 null
address는 "경기도 고양시" 라는 문자열 인스턴스 참조(참조타입이긴 하지만 그냥 쓴다,,, 대충생각하자...ㅎ)
int는 기본형 타입. 4바이트의 메모리 차지. 거기에 50이 들어간다.
boolean은 기본형타입. 1바이트 메모리 차지. 아무것도 안 넣었으니 false 저장
접근제한자가 생략된 name, address에는 default 접근제한자가 붙은 거임.
Person class 작성하기
public class Person{
String name;
String address;
boolean isVip;
}
public class PersonTest {
public static void main(String[] args){
Person p1 = new Person(); // p1뒤에 참조값을 적어주지 않으면 p1은 null이다. 참조하지 않았음
System.out.println(p1.name);
System.out.println(p1.address);
System.out.println(p1.isVip);
}
}
name과 address는 person 클래스에서 null을 참조하고 있어서
null
null
false
가 나온다.
public class PersonTest {
public static void main(String[] args){
Person p1 = new Person();
p1.name="honggilldong";
System.out.println(p1.name);
System.out.println(p1.address);
System.out.println(p1.isVip);
}
}
honggilldong이라는 string타입의 인스턴스가 생성된다. person은 그것을 참조
System.out.println(p1.name);
은 p1이 참조하고 있는 person이 참조하고 있는 name이 참조하는 honggilldong을 출력.
문자열은 new를 사용하지 않고 인스턴스를 사용할 수 있다. 되도록 new를 사용하지 말자 (String)을 사용할 때
하도 자주 사용하니까. 그냥 " " 사이에 넣으면 쓸 수 있다. 함수 풀에 저장. (참조변수지만 아무튼)
String이라는 class는 Object라는 class를 상속받고 있다, ~~라는 interface를 구현하고 있다.
extends : 상속받는다
implements ~~~ : 의 인터페이스를 구현하고 있다.
public class PersonTest {
public static void main(String[] args){
Person p1 = new Person();
p1.name="홍길동";
System.out.println(p1.name);
System.out.println(p1.name.length());
System.out.println(p1.address);
System.out.println(p1.address.length());
System.out.println(p1.isVip);
}
}
홍길동
3
null
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "p1.address" is null
at PersonTest.main(PersonTest.java:8)
레퍼런스 타입은 뭔가를 참조하고 있어야 쓸 수 있다.
name은 홍길동을 참조하고 있지만 address는 참조하는 게 없어서 오류가 났다.
length()
는 String class의 method
person 클래스에 static int count 필드를 추가
public class Person{
String name;
String address;
boolean isVip;
static int count = 0;
}
public class PersonTest2 {
public static void main(String[] args){
Person p1 = new Person();
Person p2 = new Person();
p1.name = "홍길동";
p2.name = "조조";
System.out.println(p1.name);
System.out.println(p2.name);
System.out.println(p1.count);
System.out.println(p2.count);
p1.count++;
System.out.println(p1.count);
System.out.println(p2.count);
p2.count++;
System.out.println(p1.count);
System.out.println(p2.count);
}
}
결과
홍길동
조조
0
0
1
1
2
2
p1의 count를 증가시켜도 p2가 함께 증가되고, 그 반대도 그렇다.
why?
JVM은 CLASSPATH에서 클래스를 찾아 실행한다.
(JVM은 인스턴스를 만들기 전에 클래스가 CLASSPATH에 있는지 먼저 찾아보고, 없으면 종료한다.
왜냐면 Person이라는 클래스를 만든 사람과 Persontest2라는 클래스를 만든 사람이 다른 사람일 수 있기 때문에.)
만약 찾게 되면 Person이라는 클래스를 메모리에 올린다. 클래스 정보 자체는 정적인 정보다.
SSD나 하드디스크에 저장되어있는 것을 읽어들여서 java가 사용할 수 있게 메모리에 올린다.
그리고 static한 것을 가지고 있으면 static풀에 올린다. 4byte의 static count영역을 별도로 가진다.
그렇기 때문에 p1,p2의 count는 같은 값을 가진다.
(원래) 인스턴스를 만들지 않아도 person이라는 타입만 사용하면 static한 필드는 미리 메모리에 올라간다.
따라서 count를 사용할 때는 person.count로 사용하는 게 좋은 것. (클래스명.필드명) 형식!! 메소드 처럼!!
static 필드를 클래스 변수라고 하기도 한다!
'프로그래밍 > java' 카테고리의 다른 글
7. java 패키지 (0) | 2023.04.10 |
---|---|
6. java 클래스 잘 만들기 (0) | 2023.04.10 |
4. java 메소드가 실행될 때 어떤일이 벌어지는가? (0) | 2023.03.16 |
3. java 메소드 선언방법, UML표기법 익히기 (0) | 2023.03.16 |
2. java 객체지향 프로그래밍 (1) (0) | 2023.03.10 |
댓글