메서드, 멤버필드, static

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 동적
	
	
}

'자바 프로그래밍 > 코드' 카테고리의 다른 글

List, Set, Map  (0) 2020.03.09
생성자  (0) 2020.03.09
객체지향 - 인스턴스, 정보은닉  (0) 2020.02.16
메서드 오버로딩  (0) 2020.02.16
method를 call하면서 인자값이 몇개인지 모르는 상황일때  (0) 2020.02.16