<메소드>
<예제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); } }
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);
}
}
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개만 입력해도 됨
}
}