자바 프로그래밍/코드
메서드, 멤버필드, static
구리Guri
2020. 3. 9. 15:51
Main.java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Tv tv = new Tv(5,10);
//따로 call하지 않았음에도 생성자메서드가 자동으로 call되어서 "Tv 생성자 메서드 입니다." 라는 생성자 내의 출력코드가 실행됨을 확인할 수 있다.
//매개변수가 있는 생성자를 만들었기 때문에 인자값을 입력해서 인스턴스를 생성하게 된다.
Tv tv1 = new Tv();
//매개변수를 명시한 생성자가 생긴 순간, 매개변수가 없는 생성자는(디폴트 생성자)가 지워져서 매개변수 없이 인스턴스를 만들려면 오류가 난다.
//매개변수가 없는 생성자를 오버로딩함으로서 오류를 해결할 수 있다.
Scanner sc = new Scanner(System.in);
//같은 Scanner 인스턴스이지만, 괄호안에 뭘 넣냐에 따라서 생성자 메서드에 들어가는 값이 다른 것을 이용하여서?
//키보드값을 입력받는 Scanner가 될 수도 있고, 네트워크값을 입력받는 Scanner가 될 수도 있다.
tv.setChannel(5); //사용자가 넣는 값
tv.setVolume(10);
System.out.println(tv.getChannel());
System.out.println(tv.getVolume());
Person p1 = new Person("A0001","LEE",25);
Person p2 = new Person("A0002","KIM",29);
Person p3 = new Person("A0003","PARK",20);
Temp t = new Temp();
t.a=10;
t.b=20; //인스턴스 멤버필드처럼 똑같이 사용할 수도 있다.
//b는 클래스 멤버필드, 프로그램(main)이 시작되자마자 바로 생성됨 main라인과 동시에 실행
//b는 인스턴스를 만들지 않아도 쓸 수 있음.
//static 키워드가 붙은 것들은 클래스와 무관함. 따로 놈.
Temp.b=50;
//인스턴스 없이(인스턴스를 new로 생성하지 않아도) 클래스 기준에서 바로 사용 가능 하기 때문에 클래스 멤버필드라고 한다.
Temp t1= new Temp();
Temp t2= new Temp();
Temp t3= new Temp();
System.out.println(t1.b);
t1.b=30;
System.out.println(t2.b);
//모든 인스턴스가 data영역에 있는 클래스멤버변수 b를 공유하고 있기 때문에
//어느 인스턴스의 참조를 통해서 클래스멤버변수 b의 값을 수정하였다면 다른 인스턴스가 클래스멤버변수 b를 접근하였을때 수정된 값으로 나오게 된다
//같은 클래스를 갖고 만들어진 인스턴스 사이에서 값이 교류(공유)된다?
//public static을 붙이면 언제나,어디서나 사용할 수 있는 변수라 할 수 있음 ---> 전지역변수 =전역변수 라 할 수 있겠다~~
//편하지만 남발하면 안되는....
//지역변수,매개변수 -> 메모리 효율성이 좋음, 사용이 끝나면 메모리를 반환하기 때문에
//인스턴스멤버변수 -> new해서 인스턴스 생성과 동시에 메모리를 차지함. 인스턴스가 살아있는 동안 살아있다가 인스턴스가 모든 레퍼런스가 끊기면서 삭제되는 순간 인스턴스 멤버변수도 사라지고 메모리를 반환함. (지역변수 보다는 오래 살아있지만 여전히 메모리 효율성이 있음.)
//클래스멤버변수 -> 프로그램(main)이 시작됨과 동시에 메모리를 차지함. 사용했던 안했던간에 프로그램이 끝나야 반환됨. (메모리유동성이 낮음. 효율성이 떨어짐.) = 프로그램이 무겁다
//거의 안쓰게 되지만 적절한 시기에 사용한다...
//RPG게임 주인공의 레벨,경험치,공격력,방어력 등은 게임이 시작되서 끝날때까지 unloading되면 안되는 값들이다
//프로그램 전체에서 단 한번도 사라지지 않고 이용되면서 모든 코드상에서 다 사용되야하는 값들 -> static으로 선언
}
}
Tv.java
public class Tv {
private int channel=1; //((Default Value:기본값))설계자가 넣은 값(사용자는 넣을 수 없음). 나중에 인스턴스가 될 때(new를 하는 시점)에 5를 넣어주겠다. 설계도상에서 쓴 것. 인스턴스가 되자마자 들어가는 것.
private int volume;
//설계도에는 변수를 만들었지만 아직 실체가 없다, 메모리에 구현하려면 new라는 키워드를 통해 인스턴스를 만들면서 그 내부에 2개의 변수가 생성이 되는 것.
//지역변수,매개변수는 stack을 씀
//heap에다가 변수를 만들게 되면(멤버변수) 자동으로 0이 들어가 있다.
//stack에다가 변수를 만들게 되면(지역변수...) 쓰레기값이 들어있어서, 초기값을 넣어줘야한다.
//Tv(){} //쓰지 않았다면 디폴트로 생성된 생성자
public Tv(int channel, int volume){ //생성자메서드의 매개변수를 만들면 인스턴스가 만들어질때 초기값을 넣어줄때 사용하는 메서드
//생성자를 쓰던, setter를 쓰던 개발자 본인의 취향. but 셋팅을 잘해놓으면 편리하다.
//생성자는 setter보다는 먼저이고, 멤버변수 보다는 뒤에 실행된다고 생각하면 된다.
//인스턴스 생성시 멤버변수 선언 -> 생성자메서드 -> setter메서드 등으로 흘러감.
System.out.println("Tv 생성자 메서드 입니다.");
this.channel=channel;
this.volume=volume;
}
public Tv() {} //매개변수가 없는 생성자 메서드를 오버로딩
//alt+shift+s 누르고 o 누르면 Generate constructor using Fields 메뉴를 이용하여 생성자 메서드를 만들 수도 있다.
//생성자 메서드는 new해서 인스턴스가 생성되는 순간 자동으로 콜하게 됨.
// Constructor : 생성자 메서드
// 생성자 메서드의 이름은 클래스의 이름과 동일해야한다.
// 생성자 메서드는 Return값을 가지지 않는다.
// 생성자는 호출시기를 사용자 마음대로 지정할 수 없다.
// > 생성자 메서드 호출 시기는 인스턴스 생성시기이다.
// 그 외의 모든 규칙은 일반 메서드와 동일하다.
// (매개변수, 오버로딩 등....)
//암묵적 문법 : 눈에는 안보이지만 존재하는 것들 (import java.lang.*, 클래스 내에 this 같은..)
//정보은닉하기 : private를 붙여서 변수를 만들고 setter와 getter를 만드는 것
//alt+shit+s 누르고 r 누르면 Generate Getters and Setters 메뉴로 감
//거기서 또 alt+A 누르면 생성가능한 Getters and Setter들이 전부 선택됨
//가급적 단축키 없어도 만들 수 있도록 외우기
public int getChannel() {
return channel;
}
public void setChannel(int channel) {
this.channel = channel;
}
public int getVolume() {
return volume;
}
public void setVolume(int volume) {
this.volume = volume;
}
}
Temp.java
//임시 클래스~?
public class Temp {
//멤버필드=멤버변수인데... 풀네임으로 더 따지자면
public int a;
//a는 인스턴스 멤버필드(instance member field)
//new로 인스턴스를 만들었을 때 그 인스턴스 안에서 구성되는 멤버
//heap memory에 저장됨
//인스턴스가 만들어지기 전에는 없고,인수턴스가 끝나면 사라짐
public static int b;
//b는 클래스 멤버필드(Class member field)
//static 키워드가 붙어있는 변수는 인스턴스 내부에 구성되지 않는다.
//data memory에 저장됨(stack도 heap도 아님!)
//프로그램(main)이 시작되자마자 바로 생성됨 main라인과 동시에 실행
//static 정적(고정된), dynamic 동적
}