<메소드>

<예제1>
package com.step2;
class  Param {
	int ival; // 전역변수 
    // 전역변수는 (생성자가 대신 해주기 때문에) 초기화 생략 가능
}
public class TestParam {
	void effectParam(Param p) { 
    // 여기서 p는 선언은 됐지만, 메인에서 호출하기 전에는 p=null; 상태
    // 호출 됐을 때 p = new Param이 되는 것
	}
	public static void main(String[] args) {
		Param p = new Param(); // 다른 클래스의 ival 호출 위해 인스턴스화
		System.out.println("main ival ==> " + p.ival);
	}
}
  • 출력: 0

  • TestParam.java 하나의 문서 안에 두 개의 클래스(Param.class / TestParam.class)가 존재
  • Param.class에는 오직 ival 변수 하나만 있으며, 디폴트 값은 0(자바는 int의 디폴트값 제공)
  • 그런데 main 메소드는 TestParam에 있음
    : 메인 메소드가 없어도 컴파일 에러가 발생하지 않는 걸 통해서 모든 클래스가 다 메인메소드를 가질 필요가 없다는 걸 알 수 있다.
  • 단, TestParam.class에서만 실행이 가능
    → 왜? 여기에만 메인 메소드가 있고 Param.class에는 없으니까
  • System.out.println("main ival ==> " + p.ival);
    : TestParam 클래스에 선언되지 않은 ival 변수를 사용하기 위해 반드시 인스턴스화 → 왜? 내 클래스 안에 선언된 변수가 아니니까
  • 그런데 effectParam 메소드는 호출되지 않음(중요한 포인트)
<예제2>
package com.step2;
class  Param {
	int ival; 
}
public class TestParam {
	void effectParam(Param p) {
	}
	public static void main(String[] args) {
		Param p = new Param();
		p.ival = 500; // 0에서 500으로 재정의
		System.out.println("main ival ==> " + p.ival);
	}
}
  • 출력: 500

<예제3>
package com.step2;
class  Param {
	int ival;
}
public class TestParam {
	void effectParam(Param p) {
		p.ival = 100;
		System.out.println("sub ival ==> " + p.ival);
	}
	public static void main(String[] args) {
		Param p = new Param();
		p.ival = 500;
		TestParam tp = new TestParam(); 
  		// 두 번째 인스턴스화
  		// heap 메모리에 자리함(끼워져있다/호출·처리할 수 있다)
		tp.effectParam(p); // effectParam p 값을 불러왔기 때문에
		System.out.println("main ival ==> " + p.ival);
	}
}
  • 출력: sub ival ==> 100
    main ival ==> 100

Null

<예제1>
package com.step2;
class  Param {
	int ival;
}
public class TestParam {
	void effectParam(Param p) { // 지금 상태는 p = null;
		*p.ival = 100; 
  		// Null 상태에서는 p를 사용할 수 없다. NullPointerException이 발동
		// p라는 인스턴스를 사용해야 100이 됨
		System.out.println("sub ival ==> " + p.ival);
	}
	public static void main(String[] args) {
		Param p = null; 
  		// Null 상태에서는 주소번지가 할당되지 않음
		p = new Param();
		*p.ival = 500;
		System.out.println("main ival ==> " + p.ival);
	}
}
  • 출력: main ival ==> 500
  • 두 *p.ival의 주소 번지가 같을까?
    → 다른 객체 복사본이기 때문에 다름
    <예제2>
    package com.step2;
    class  Param {
    	int ival;
    }
    public class TestParam {
    	void effectParam(Param p) { // 원래 상태는 p = null;
    		p = new Param(); 
    		// null이 넘어왔지만 new로 생성했기 때문에 정보가 찍힘
    		// 선언부가 아닌 생성부에 클래스가 만들어지기 때문에 객체가 생성이 된 것
    		p.ival = 100; 
    		System.out.println("sub ival ==> " + p.ival);
    	}
    	public static void main(String[] args) {
    		Param p = null;
    		p = new Param();
    		p.ival = 500;
    		TestParam tp = new TestParam();
    		tp.effectParam(p);
    		System.out.println("main ival ==> " + p.ival);
    	}
    }
  • 출력: sub ival ==> 100
    main ival ==> 500

<예제1>
package com.step2;
import javax.swing.JFrame;
	public class JFrame1 {
		public static void main(String[] args) {
          JFrame jf1 = new JFrame();
          JFrame jf2 = new JFrame();
          jf1.setTitle("첫번째");
          jf2.setTitle("두번째");
          jf1.setSize(300, 500);
          jf2.setSize(500, 300);
          jf1.setVisible(true);
          jf2.setVisible(true);
	}
}
<예제2>
package com.step2;
import javax.swing.JFrame;
	public class JFrame2 {
		public static void main(String[] args) {
  			JFrame jf1 = new JFrame(); // 생성
  			jf1 = null; // null로 초기화
  			// 기존에 생성된 객체 참조가 끊어짐
  			jf1 = new JFrame();
  			// 새로운 객체 참조
  			jf1.setTitle("첫번째");
  			jf1.setSize(300, 500);
  			jf1.setSize(800, 500); 
  			// 다시 재정의되었기 때문에 가로 800으로 출력
  			jf1.setVisible(true);
		}
	}
  • jf1 = null;에서 jf1 = new JFrame();으로 진행되는 순간
    자바의 가비지 컬렉터(JVM에서 인터셉트로 쓰레기값으로 빼버리는 것)에 의해 JFrame jf1 = new JFrame();은 candidate 상태로 빠져서 다시 사용할 수 없게 되었고, jf1 = new JFrame();에 다시 생성된 것
  • candidate: 너 쓰레기여서 앞으로 사용 못해
package com.step2;
public class String1 {
	public static void main(String[] args) {
		String s1 = new String("키위");
		System.out.println(s1);
		s1 = new String("키위");
		System.out.println(s1);		
	}
}
  • String타입은 클래스지만 원시형 타입처럼 값이 출력되어 주소번지를 볼 수 없음
  • 같은 이름의 변수(s1)이더라도 new를 사용해서 인스턴스화를 한 번 더 하면 새로운 객체가 만들어지는 것

getter / setter 메소드

<원소스>
package com.step2;
class PrideTest {
	int speed;
	String carColor;
	int wheelNum;
	public int Speed() {
		return speed;
	}
	public String CarColor() {
		return carColor;
	}
	public int Wheel() {
		return wheelNum;
	}
}
public class PrideSimulation2 {
	public static void main(String[] args) {
		PrideTest myCar	  = new PrideTest(); // 30km
		myCar.speed = 30;
		PrideTest yourCar = new PrideTest(); // 50km
		yourCar.speed = 50;
		PrideTest himCar  = new PrideTest(); // 100km
		himCar.speed = 100;
		System.out.println(myCar.Speed());
		System.out.println(yourCar.Speed());
		System.out.println(himCar.Speed());
	}
}
출력: 30
     50
     100
  • 하지만 int speed; / String carColor; / int wheelNum; 앞에 private가 붙으면서 에러 발생

    → 해결하기 위해 getters, setters 생성
  • Getter 메소드: 멤버 변수의 값을 반환
  • Setter 메소드: 멤버 변수의 값을 설정
  • 생성방법: private 변수들 선택 → 우클릭 → source → Generate Getters and Setters → 해당 변수명 선택 → Insertion point를 After '가장 마지막 변수'로 선택
<생성 후> 
package com.step2;
class Pride {
	private int speed;
	private String carColor;
	private int wheelNum;
	// getter 메소드는 전역변수에 담긴 값을 꺼낼 때 사용하자
	public int getSpeed() {
		return speed;
	}
	public void setSpeed(int speed) {
		this.speed = speed;
	}
	public String getCarColor() {
		return carColor;
	}
	// setter 메소드는 전역변수가 private이라서 직접 접근이 불가하니까
	// 메소드의 파라미터 자리를 활용하여 결정된 값을(값을 알고 있는 사용자나 업무 담당자가) 값을 전변에 초기화해주는 코드다.(this 붙어있는 코드)
	public void setCarColor(String carColor) {
		this.carColor = carColor;
	}
	public int getWheel() {
		return wheelNum;
	}
	public void setWheel(int wheelNum) {
		this.wheelNum = wheelNum;
	}
}
public class PrideSimulation {
	public static void main(String[] args) {
		Pride myCar	  = new Pride(); // 30km
		myCar.setSpeed(30);
  		~~myCar.speed = 30;~~
		Pride yourCar = new Pride(); // 50km
		yourCar.setSpeed(50);
  		~~yourCar.speed = 50;~~
		Pride himCar  = new Pride(); // 100km
		himCar.setSpeed(100);
  		~~himCar.speed = 100;~~
		System.out.println(myCar.getSpeed());
		System.out.println(yourCar.getSpeed());
		System.out.println(himCar.getSpeed());
	}
}
출력: 30
     50 
     100

<예제1>

package com.step2;

public class Dept { // 클래스 안에 여러가지의 변수를 담을 수 있다
    private int deptno = 0; // 부서번호
    private String dname = null; // 부서명
    private String loc = null; // 근무지역-부서
    // write, save
    public void setDeptno(int deptno) {
      this.deptno = deptno; // 지역변수를 전역변수로 불러들이기 위해 this
      // 파라미터에 들어온 값을 왼쪽에 대입(전역변수 초기화)
      // 전역변수 값이 동기화 되도록
    }
    public void setDname(String dname) {
      this.dname = dname;
    }
       public void setLoc(String loc) {
      this.loc = loc;
    }
    // read. 읽으려면 반환타입 필요
    public int getDeptno() {
      return deptno; // 
    }
    public String getDname(){
      return dname;
    }
    public String getLoc(){
      return loc;
    }
  }

<예제2>

package com.step2;

public class DeptSimulation {
  public static void main(String args[]) {
    // Dept 클래스를 설계하고 그 안에 부서집합에 필요한 변수 3개를 선언하였다
    // 단, 접근제한자를 private으로 하여 직접 접근이 불가하도록 하였다
    // 왜냐면 외부에서 인스턴스 변수를 가지고 위변조를 막고 싶어서 그렇게 하였다
    Dept dept = new Dept();
    dept.setDeptno(10);
    dept.setDeptno(20);
    int deptno = 30;
    dept.setDeptno(deptno);
    System.out.println(dept.getDeptno());
    // dept.dname = "개발부"; // 할 수 없다. 접근자가 private이라 직접 담을 수 없다.
    dept.setDname("개발부");
    String dname = "운영팀";
    dept.setDname(dname);
    System.out.println(dept.getDname()); // 운영팀 출력
  }
}
출력: 30
     운영팀

<화면 만들기-예제1>

package com.step2;

import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class JPnel1 {
	int width = 300;
    // setSize 메소드의 파라미터는 int이다. 따라서 int타입을 선언한다
	int height = 500;
	boolean isView = false;
    // false이면 메모리에는 로딩중이나 화면에만 안 보임
	// true로 초기화를 했다면, 메모리에도 존재하고 실제 화면상에도 보임
  
	JFrame jf = new JFrame();
	JPanel jp = new JPanel();
	JTextField jtf = new JTextField("");

	public void initDisplay( ) { // 화면 그리는 메소드 선언
		jp.setBackground(Color.black);
		jf.add("Center", jp); 
  		// add 메소드는 파라미터를 두 개 넣어야 함
        // 첫 번재는 String, 두 번째는 화면에 붙일 주소번지 사용
		jf.add("South", jtf);
		jf.setSize(width, height); 
  		// 첫 번째 파라미터 자리는 화면 가로 길이를 입력 받고 
  		// 두 번째 자리는 화면의 높이를 입력 받음
		jf.setVisible(isView); 
  		// setVisible 메소드의 파라미터 자리에는 true 혹은 false가 올 수 있음
  		// setSize메소드와 setVisible메소드는 JFrame 클래스가 정의하고 있는 메소드이다
	}
  
	public static void main(String[] args) {
		// initDisplay() 호출하시오.
		JPnel1 jp1 = new JPnel1();
		jp1.isView = true; 
  		// boolean isView = false; 대신 이렇게도 할 수 있음
		jp1.initDisplay();
	}
}

<화면 만들기-예제2> : 메소드 오버로딩

package com.step2;

import javax.swing.JFrame;

public class JPnel2 {
	JFrame jf = new JFrame();
	// 화면 그리는 메소드 선언 - 자바에서는 같은 이름의 메소드를 중복 선언할 수 있다
	public void initDisplay(int width, int height) { // 화면 그리는 메소드 선언
    //자바에서는 같은 이름의 메소드를 중복 선언할 수 있다
		jf.setSize(width, height);
		jf.setVisible(true); 
	}
	public void initDisplay(int width, int height, boolean isView) {
		jf.setSize(width, height);
		jf.setVisible(isView); 
	}
	public static void main(String[] args) {
		JPnel2 jp1 = new JPnel2();
		jp1.initDisplay(600,500); 
  		// 11번에 true를 상수로 넣었기 때문에 파라미터 2개만 입력해도 됨
	}
}

0개의 댓글