생성자는 ? 생성자는 필드의 변수를 초기화하는 용으로 사용하고, 메인메소드 실행 후 경유하게 된다.
다양한 인스턴스화란? 메인에서의 실행, 조건으로 실행 등 다양한 방법으로 인스턴스화 하는 방식에 대해 학습하는 것이 필요하다.
equals란? ==는 주소번지가 같은지 비교해준다면, equals는 그 안에 들어있는 값이 같은지 비교해주는 것으로 둘은 엄연히 다르다.
JAVA의 구성
nextInt() : int - Random
toString() : String - Object
setSize() : void - Window(JFrame)
setVisible() : void - Window(JFrame)
---------- ------- ------ --------------
**메소드이름 다트연산자 리턴 소유주**
package com.week2;
//진행 순서 : 9-10-11-5-6-7-12
public class Pride {
int speed = 0;
// String carColor = "검정";
// int wheelNum = 4;
//생성자 - 파라미터가 없는 생성자는 JVM이 대신 주입해줌 - 그래서 나는 안했음.
public Pride() {
speed = 10; //왜 인스턴스 변수 없이 접근이 가능할까?
System.out.println("Pride()디폴트 생성자 호출 성공");
}
public static void main(String[] args) {
Pride myCar = null; //선언만 진행 -> 타입만 결정(객체x, 주소번지x, 사용x -> 실체가 없어서 NullPointerException 발생하기 때문에)
myCar = new Pride(); //생성도 진행 -> 주소번지o
System.out.println(myCar); //클래스 및 생성자도 호출
System.out.println(myCar.speed); //왜 10일까? 생성자를 경유하기 때문에
int speed = 100; //지변
System.out.println(speed); //100
speed = 30; //지변 초기화
System.out.println(speed); //30
myCar.speed = 20; //전변(인스턴스변수 뒤에 들어가는 전변)
// speed = 30; //static 영역에서 static 없는 변수는 사용 x, 접근 x
//가능하게 하려면 인스턴스변수.speed로 호출, 재정의, 초기화 o
System.out.println(myCar.speed); //왜 20일까? 0>10>20 으로 그 값이 18번에서 재정의 되었기 때문에!
}
}
package com.week2;
//A메소드 없을 때 순서 : 메인(선언) - 생성자 - 메인(메소드실행) - initDisplay() 메소드 실행 - 메인마무리
//A메소드 있을 때 순서 : 메인(선언) - 생성자 - 메인(메소드실행) - initDisplay() 메소드 실행 - 메인(메소드실행) - methodA 실행
import javax.swing.JFrame;
public class JFrameTest1 extends JFrame {
//파라미터가 없으니 JVM에서 대신 만들어줄 수 있음.
//파라미터가 있으면 JVM에서 만들어 줄 수 없음(JVM이 임의로 정하면 안되니까)
public JFrameTest1() { //파라미터가 없는 생성자 - 디폴트 생성자 호출(선언)
System.out.println("디폴트 생성자 호출");
//생성자 안에서는 static이 없어서 인스턴스 변수 없이 사용가능함.
initDisplay();
methodA();
}
//사용자 정의 메소드 - 화면출력 메소드 선언해보기
public void initDisplay() {
System.out.println("initDisplay 호출");
//내 안에 선언된 메소드가 아니다. 그럼 어디에? JFrame에 있음.
//this는 자바가 제공하는 수정자이고, 보통 자기 자신을 가리킬 때 사용함.
//주로 전변과 지변의 이름이 같은 경우, 구분하기 위해 개발자가 명시적으로 붙여준다.(생략x, 직관적)
this.setSize(500,400); //메소드 호출
this.setVisible(true);
}
public void methodA() {
System.out.println("methodA 호출");
}
public static void main(String[] args) {
//인스턴스변수가 사라져서 실행 x
//생성자 위치로 옮겨서 사용 가능
// jft.initDisplay();
// jft.methodA();
new JFrameTest1();
new JFrameTest1().methodA(); //창이 두개 뜨는 이유는? 12번에서 initDisplay 메소드가 두 번 실행됨.
//변수 이름이 없으면 지역변수로 선언되어 참조되는 클래스를 다른 메소드에서 재사용x
}
}
package com.week2;
//A메소드 없을 때 순서 : 메인(선언) - 생성자 - 메인(메소드실행) - initDisplay() 메소드 실행 - 메인마무리
//A메소드 있을 때 순서 : 메인(선언) - 생성자 - 메인(메소드실행) - initDisplay() 메소드 실행 - 메인(메소드실행) - methodA 실행
import javax.swing.JFrame;
public class JFrameTest1 extends JFrame {
//파라미터가 없으니 JVM에서 대신 만들어줄 수 있음.
//파라미터가 있으면 JVM에서 만들어 줄 수 없음(JVM이 임의로 정하면 안되니까)
public JFrameTest1() { //파라미터가 없는 생성자 - 디폴트 생성자 호출(선언)
System.out.println("디폴트 생성자 호출");
}
//사용자 정의 메소드 - 화면출력 메소드 선언해보기
public void initDisplay() {
System.out.println("initDisplay 호출");
//내 안에 선언된 메소드가 아니다. 그럼 어디에? JFrame에 있음.
//this는 자바가 제공하는 수정자이고, 보통 자기 자신을 가리킬 때 사용함.
//주로 전변과 지변의 이름이 같은 경우, 구분하기 위해 개발자가 명시적으로 붙여준다.(생략x, 직관적)
this.setSize(500,400); //메소드 호출
this.setVisible(true);
}
public void methodA() {
System.out.println("methodA 호출");
}
public static void main(String[] args) {
JFrameTest1 jft = new JFrameTest1();
jft.initDisplay();
jft.methodA();
}
}
package com.week2;
//A메소드 없을 때 순서 : 메인(선언) - 생성자 - 메인(메소드실행) - initDisplay() 메소드 실행 - 메인마무리
//A메소드 있을 때 순서 : 메인(선언) - 생성자 - 메인(메소드실행) - initDisplay() 메소드 실행 - 메인(메소드실행) - methodA 실행
import javax.swing.JFrame;
public class JFrameTest1 extends JFrame {
//파라미터가 없으니 JVM에서 대신 만들어줄 수 있음.
//파라미터가 있으면 JVM에서 만들어 줄 수 없음(JVM이 임의로 정하면 안되니까)
public JFrameTest1() { //파라미터가 없는 생성자 - 디폴트 생성자 호출(선언)
System.out.println("디폴트 생성자 호출");
//생성자 안에서는 static이 없어서 인스턴스 변수 없이 사용가능함.
initDisplay();
//아래 메소드는 이름은 같지만 파라미터의 갯수가 달라서 다른 메소드로 인지함.(메소드 오버로딩)
methodA(); //25번의 메소드임.
}
//사용자 정의 메소드 - 화면출력 메소드 선언해보기
public void initDisplay() {
System.out.println("initDisplay() 호출");
//내 안에 선언된 메소드가 아니다. 그럼 어디에? JFrame에 있음.
//this는 자바가 제공하는 수정자이고, 보통 자기 자신을 가리킬 때 사용함.
//주로 전변과 지변의 이름이 같은 경우, 구분하기 위해 개발자가 명시적으로 붙여준다.(생략x, 직관적)
this.setSize(500,400); //메소드 호출
this.setVisible(true);
}
public void methodA() {
System.out.println("methodA() 호출");
}
public void methodA(JFrameTest1 jft) { //이렇게 참조형으로 넣는 것을 늘려야 함.
//27번과 32번이 같은 것을 참조하고 있는것인지?
//지변이지만 메소드 호출시 파라미터를 통해서 원본을 넘길 수 있다.
System.out.println("methodA(JFrameTest1 jft) 호출");
System.out.println(jft);
}
public static void main(String[] args) {
//메인 메소드 내부에서 인스턴스화를 하게 되면 지변의 성격을 갖게 됨.
JFrameTest1 jft = new JFrameTest1();
System.out.println(jft); //지변이지만 메소드 호출시 파라미터를 통해서 원본을 넘길 수 있다.
//메소드 파라미터 자리가 원시형 타입인 경우, 갯수 판단하고 결정
//메소드 파라미터 자리가 참조형 타입인 경우, 동일
jft.methodA(jft); //참조형 타입
}
}
다양한 방법으로 다른 사람이 구현한 클래스를 주입(인스턴스화)하는 방식에 대해 학습 필요 → spring 프레임워크의 의존성 주입, 제어역행에 대해 사전에 준비할 수 있는 단추가 됨.
메인에서의 생성(기본)
public static void main(String[] args) {
AddressBook abook = new AddressBook(); //기본단계
}
메소드를 활용한 인스턴스화(보통) → 객체를 어떤 조건에 따라 생성할 수 있음. (선처리, 후처리 사용) , 아래 예시는 ‘싱글톤’의 예시?!
public AddressBook getObject() {
//이와 같이 null유무를 체크해서 생성하는 건 '하나만 관리하겠다.', '싱글톤'을 의미
if(abook == null) { //객체를 생성하기 전에 null체크를 먼저(선처리) 해서
abook = new AddressBook();
}
return abook;
}
public static void main(String[] args) {
AddressBook abook = new AddressBook(); //기본단계
}
}
public class AddressDialog {
//선언부
//화면처리부
//메인 메소드
public static void main(String[] args) {
}
}
이벤트 처리 3단계
- 버튼의 이벤트를 지원하는 인터페이스를 implements 한다.(예 : ActionListener)
- 인터페이스?이종 간의 역할, 그 역할을 자연스럽게 하는 개발이 폭 넓은 개
- 해당 인터페이스가 선언하고 있는 메소드를 오버라이딩해야 한다.(예 : ActionPerformed(ActionEvent e))
- 이벤트 소스와 이벤트 처리를 담당하는 클래스를 매칭한다.
package com.week2;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
//클래스 선언
//ActionListener는 인터페이스여서 추상메소드를 갖고 있다. -> 개발자가 구현하는 것에 따라 구성되도록! 추상으로 더함.
//추상메소드란, 선언만 되어있고, 좌중괄호와 우중괄호가 없는 메소드를 말함.
public class AddressBook implements ActionListener{ //버튼이 눌러진 이벤트를 감지하여 의도대로 코드를 삽입할 수있음.
JFrame jf = new JFrame(); //창 구상
JPanel jp_north = new JPanel(); //버튼 4개 배치로 사용, 모양 없음. 화면을 그리는 클래스(컴포넌트)
JButton btnSelct = new JButton("조회"); //버튼 생성
JButton btnInsert = new JButton("입력");
JButton btnUpdate = new JButton("수정");
JButton btnDelete = new JButton("삭제");
//선언부
//생성자
public AddressBook() {}
//화면처리
public void initDisplay() {
//이벤트 처리하는 3단계 :
btnSelct.addActionListener(this);
btnInsert.addActionListener(this);
btnUpdate.addActionListener(this);
btnDelete.addActionListener(this);
jp_north.add(btnSelct); //jp_north에 버튼 추가
jp_north.add(btnInsert); //jp_north에 버튼 추가
jp_north.add(btnUpdate); //jp_north에 버튼 추가
jp_north.add(btnDelete); //jp_north에 버튼 추가
jf.add("North",jp_north); //추가, 위치 구성
jf.setTitle("주소록 Ver1.0");
jf.setSize(800, 500);
jf.setVisible(true);
}
//메인메소드
public static void main(String[] args) {
AddressBook abook = new AddressBook(); //기본단계
abook.initDisplay();
}
//아래 메소드는 ActionListener인터페이스에 이름이 정해져 있다.
//구현체 클래스인 너가 재정의하여 구현해라.
@Override //annotation
public void actionPerformed(ActionEvent e) {
//눌려진 버튼의 문자열을 읽어온다. - 버튼이 눌렸을 때, 버튼을 누르는 건 사용자
//눌렸다는 건 JVM만 알 수 있다. 파라미터 자리에 e를 가지고 getActionCommand를 호출하면
//String 타입의 라벨을 출력함.
String command = e.getActionCommand(); //위에 입력된 조회, 입력, 수정, 삭제의 문자열을 가져옴.
}
}
package com.week2;
import javax.swing.JDialog;
public class AddressDialog {
//선언부
JDialog jdg_address = new JDialog();
//생성자
//1. 생성자에 메소드를 넣어둔 뒤 다른 메소드에서 호출없이 사용가능하도록 할 수 있음.
//화면처리부
public void initDisplay() {
jdg_address.setTitle("조회 | 입력 | 수정"); //세 개로 나오려면 메소드 설계, 파라미터 결정
jdg_address.setSize(400,500);
jdg_address.setVisible(true);
}
//인스턴스화를 한다. 위치를 선택 - 전역 / 지변 선택
//메인 메소드
/*
public static void main(String[] args) {
AddressDialog ad = new AddressDialog();
ad.initDisplay();
}
*/
}
@Override //annotation
public void actionPerformed(ActionEvent e) {
//눌려진 버튼의 문자열을 읽어온다. - 버튼이 눌렸을 때, 버튼을 누르는 건 사용자
//눌렸다는 건 JVM만 알 수 있다. 파라미터 자리에 e를 가지고 getActionCommand를 호출하면
//String 타입의 라벨을 출력함.
String command = e.getActionCommand(); //위에 입력된 조회, 입력, 수정, 삭제의 문자열을 가져옴.
System.out.println(command);
//너 조회를 원해? -> 조건식 -> else if문(단순 if보다 일의 양 감소)
if("조회".equals(command)) {
System.out.println("조회버튼을 클릭하였습니다.");
aDialog.jdg_address.setVisible(true);
aDialog.jdg_address.setTitle("조회");
//너 입력하려고?
}else if("입력".equals(command)) {
aDialog.jdg_address.setTitle("입력");
aDialog.jdg_address.setVisible(true);
System.out.println("입력버튼을 클릭하였습니다.");
//너 수정하려고?
}else if("수정".equals(command)) {
System.out.println("수정버튼을 클릭하였습니다.");
aDialog.jdg_address.setVisible(true);
aDialog.jdg_address.setTitle("수정");
//너 삭제할거니?
}else if("삭제".equals(command)) {
System.out.println("종료버튼을 클릭하였습니다.");
}
public class AddressDialog {
//선언부
JDialog jdg_address = new JDialog();
//생성자
//1. 생성자에 메소드를 넣어둔 뒤 다른 메소드에서 호출없이 사용가능하도록 할 수 있음.
//화면처리부
//메소드 설계를 통해 반복되는 코드와 제어권은 AddressBook에 가지면서도
//그 변화된 부분은 AddressDialog가 처리하는 방법을 알아보자.
//버튼이 눌리는 건 AddressBook 클래스에서 알고 있음. - actionPerformed가 있음.
//그 버튼이 눌렸을 때, AddressDialog클래스에 title값을 변경해야함.
//AddressBook에서 눌린 라벨값을 set 메소드의 파라미터를 통해 받아오고
//setTitle 메소드를 호출하여 이 문제를 해결할 수 있을 것이다.
//조회버튼을 감지하는 if 문 안에서 set 메소드를 호출하시오.
public void set(String title, boolean isView) {
jdg_address.setTitle(title); //세 개로 나오려면 메소드 설계, 파라미터 결정
jdg_address.setVisible(isView);
System.out.println(title + " 버튼을 클릭하였습니다.");
}
public void initDisplay() {
jdg_address.setTitle("조회 | 입력 | 수정"); //세 개로 나오려면 메소드 설계, 파라미터 결정
jdg_address.setSize(400,500);
}
public static void main(String[] args) {
AddressBook abook = new AddressBook(); //기본단계
abook.initDisplay();
}
//아래 메소드는 ActionListener인터페이스에 이름이 정해져 있다.(자바에서 제공되는 메소드)
//구현체 클래스인 너가 재정의하여 구현해라.
@Override //annotation
public void actionPerformed(ActionEvent e) {
//눌려진 버튼의 문자열을 읽어온다. - 버튼이 눌렸을 때, 버튼을 누르는 건 사용자
//눌렸다는 건 JVM만 알 수 있다. 파라미터 자리에 e를 가지고 getActionCommand를 호출하면
//String 타입의 라벨을 출력함.
String command = e.getActionCommand(); //위에 입력된 조회, 입력, 수정, 삭제의 문자열을 가져옴.
System.out.println(command);
//너 조회를 원해? -> 조건식 -> else if문(단순 if보다 일의 양 감소)
if("조회".equals(command)) {
aDialog.set("조회",true);
//너 입력하려고?
}else if("입력".equals(command)) {
aDialog.set("입력",true);
//너 수정하려고?
}else if("수정".equals(command)) {
aDialog.set("수정",true);
//너 삭제할거니?
}else if("삭제".equals(command)) {
}
}
String 클래스는 다른 클래스와 다르게 new를 사용하지 않고 새롭게 클래스를 만들 수 있음.
== → 주소번지가 같은지 묻는 것
equals → 문자열의 값이 같은지 묻는 것
상수가 equals 앞으로 가것이 불러올 때 에러가 적음(변수일 경우, 터질 수 있음)
public static void main(String[] args) {
//s1, s2는 같은 주소번지
String s1 = "안녕";
String s2 = "안녕";
String s3 = new String("안녕");
String s4 = new String("안녕");
System.out.println(s1==s2); //true
System.out.println(s1==s3); //false
System.out.println(s1==s4); //false
System.out.println(s1.equals(s2)); //true
System.out.println(s1.equals(s3)); //true
System.out.println(s1.equals(s4)); //true
}
연습문제
피보나치 수열을 a1, a2, a3, a20항까지 출력하는 프로그램을
작성하시오.
a3 = a1 + a2;