[2023.09.27] 개발자 교육 8일 차 : 강의-복습, 생성자, equals, 다양한 인스턴스화 [구디 아카데미/김승수 강사님]

DaramGee·2023년 9월 27일
0

오늘 정리

생성자는 ? 생성자는 필드의 변수를 초기화하는 용으로 사용하고, 메인메소드 실행 후 경유하게 된다.

다양한 인스턴스화란? 메인에서의 실행, 조건으로 실행 등 다양한 방법으로 인스턴스화 하는 방식에 대해 학습하는 것이 필요하다.

equals란? ==는 주소번지가 같은지 비교해준다면, equals는 그 안에 들어있는 값이 같은지 비교해주는 것으로 둘은 엄연히 다르다.

복습

  • JAVA의 구성

    • 선언부, 생성부, 메인메소드
    • 모든 클래스는 부모 클래스인 Object를 상속받고 있음.
      • 부모의 메소드, 변수를 호출, 재정의
      • 메소드 오버라이딩(재정의)할 수 있음. → 업그레이 (@Override // annotation)
      • 메소드 오버로딩할 수 있음. → 메소드 이름은 같으나, 파라미터 타입이나 값이 다르다.
    • 변수별 위치, call by value

강의 내용

  • API 보는 방법
    • 사용하려는 메소드, 클래스 확인(구글)
    • 입력할 위치 선택
    • 변수 선언 유무(파라미터 자리 등)
  • 오늘의 메소드
    • nextInt(), toString(), setSize(), setVisible()
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번에서 재정의 되었기 때문에!
    	}
    
    }
  • this
    • 자바가 제공하는 수정자이고, 보통 자기 자신을 가리킬 때 사용함.
    • 주로 전변과 지변의 이름이 같은 경우, 구분하기 위해 개발자가 명시적으로 붙여준다.(생략x, 직관적)
  • 생성자 활용 → 생성자는 필드의 변수를 초기화하는 용으로 사용함. 메인에서 쉽게 호출하기 위해 사용하는 것은 좋은 방법 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("디폴트 생성자 호출");
    		//생성자 안에서는 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();   //위에 입력된 조회, 입력, 수정, 삭제의 문자열을 가져옴.
      	}
      }
  • 주소록 실습
    • AdressDialog를 AdressBook으로 인스턴스화 방법
      • AD 생성자에 메소드를 넣어둬서 AB의 선언부에서 바로 사용 가능
      • AB의 선언부에 AD를 인스턴스화하여 사용(부모가 열리는 자리 아래에서 메소드 실행)
    • 특정 버튼 클릭시 서브창이 보이도록 설정하는 방법
      • setVisible 조정하는 행 여러개 추가(true, false 등)

  • 원본코드
    • 반복되는 코드 사용 → 일괄처리x, 시스템 과부하
      • 서브 클래스에서 처리하도록 수정
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)) {
		}
	}
  • equals 함수
    • 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
      	}
  • 피보나치수열 실습 (a3 = a1 + a2)

강의 마무리

  • 연휴 후 제어문, 배열 학습 예정
  • 숙제
    • 피보나치수열
      연습문제
      피보나치 수열을  a1, a2, a3, a20항까지 출력하는 프로그램을
      작성하시오.
      
      a3 = a1 + a2;
    • 야구게임 3자리 숫자를 맞추는 게임 구현하기 - 도전 야구숫자 게임 검색257정답 strike를 전변? ball 변수 선언 변수의 갯수 결정 할수 있다| 없다 변수의 타입을 결정할 수 있다 |없다 화면을 제공받았을때도 코드의 재사용성을 누릴 수 있도록 메소드 설계가 되었는가? 파라미터의 타입 리턴타입까지도 나느 결정할 수있고 활용할수 있는지
      1. 329 : 0스 1볼

0개의 댓글