본문 바로가기
학원수업/12월

12/14 국비학원 자바수업 13회차(생성자, this)

by 코딩마스터^^ 2022. 12. 14.

오늘 위치

ch03>practice

 

 public static void main(String[] args) {
    // Main1 m1=new Main1(); 재사용 하지 않을거면 필요없다.
    //그러나 호출이 불가능함. 변수 선언을 안했으니까.
    new Main1();//인스턴스화. 메모리에 상주가 된다. 변수나 메소드를 사용할 수 있는 상태가 된다.
    // m1.initDisplay();//non-static메소드를 스태틱에서 호출 불가능 함
    // new Main1().initDisplay(); 이렇게도 메소드 호출 가능이다. 
  }

 

private 사용위해서 getter와 setter를 사용한다.

 

디폴트 생성자는 생략이 가능하다

그러나 파라미터를 가지는 생성자는 만들어야 한다.

 

선언시 디폴트 null은 참조형이다. 클래스이다. 클래스인 경우에만 nullpointexception을 가진다.

원시형에서는 nullPointException 을 맞을 수 없다.

null이면 pointer가 필요하다. 값이 뭔지 가리켜줘야된다.

 

원시형은 필드와 메소드를 가질 수 없다. 

그러니 널포인트익셉션이 절대 없다.

원시형은 부르면 값이 나온다.

참조형은 부르면 주소번지가 나온다.

 

생성자, this에 대해 잘 정리된 블로그

[Java] 생성자 개념과 목적, this 레퍼런스, this() 호출 (tistory.com)

 

[Java] 생성자 개념과 목적, this 레퍼런스, this() 호출

생성자 개념과 목적 생성자 객체가 생성될 때 초기화 목적으로 실행되는 메소드 객체가 생성되는 순간에 자동 호출 ☞ 클래스로부터 객체를 생성할 때 수행되어 객체의 초기화를 담당하는 것

ahnty0122.tistory.com

swing해보기

package dev_java.ch03.Practice;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Main1 {
  Sub1 sub1=new Sub1(this);//this가 mian1이라는 뜻이다.
  JFrame jf =new JFrame();


  //디폴트 생성자 안에서 화면을 그리는 initDiplay 가 호출 되고 있다.
  //이 메소드는 화면을 그리는 메소드이다.
  //화면이 두 개 열린다????->괜찮니?
  public Main1(){
    initDisplay();
  }
  public void initDisplay(){
    System.out.println("initDisplay호출");
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setTitle("Main1");
    jf.setSize(400,500);
    jf.setVisible(true);
  }

  public void refresh(){
    System.out.println("refresh()-나 호출되었어");
    JOptionPane.showMessageDialog(jf, "새로고침 처리 되었습니다.");
  }
  
  public static void main(String[] args) {
    // Main1 m1=new Main1(); 재사용 하지 않을거면 필요없다.
    //그러나 호출이 불가능함. 변수 선언을 안했으니까.
    new Main1();//인스턴스화. 메모리에 상주가 된다. 변수나 메소드를 사용할 수 있는 상태가 된다.
    // m1.initDisplay();//non-static메소드를 스태틱에서 호출 불가능 함
    // new Main1().initDisplay(); 이렇게도 메소드 호출 가능이다. 
  }
}
/*
 * 디폴트 생성자는 생략이 가능하다. 
 * 파라미터가 있는 생성자는 생략이 불가능하다.
 * 파라미터가 있는 생성자가 하나라도 있으면 디폴트 생성자도 생략 불가하다.
 * 인스턴스화 할 때 생성부의 이름으로 객체가 생성이 된다.
 * 이때 파라미터 자리에 인자를 추가할 수 있다. -여러개의 생성자를 선언할 수 있다.
 * 단, 파라미터의 갯수가 다르거나 타입이 달라야 한다.
 * 
 */
package dev_java.ch03.Practice;

import javax.swing.JButton;
import javax.swing.JDialog;
// import javax.swing.JFrame;
import javax.swing.JOptionPane;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;//기본 이외에 다 추가
//인터페이스를 임플리먼트하면 추상메소드를 재정의해야함

public class Sub1 implements ActionListener{
  //선언부 -전역변수의 위치
  //선언에서 결정되는 것은 무엇? 타입만 결정 되었다. 선언만 하면
  //원시형에서는 NullpointException 없다. 
  Main1 main1=null;//선언만 했다.-null의 의미는 결정이 되지 않았다는 뜻. 주소번지만 있다. 원본을 사용하겠다.
  // Main1 main1=new Main1();//선언도 했고 생성도 했고 생성자도 호출한다. 복제본이다.
  // JFrame jf = new JFrame();
  JDialog jdg=new JDialog();
  JButton jbtn=new JButton("저장");

  
  public void initDiplay(){
    
    jdg.add("South",jbtn);
    jdg.setTitle("Sub1");
    jdg.setSize(300,200);
    jdg.setVisible(true);
    jbtn.addActionListener(this);//인식????????????
  }

  public Sub1(){

  }
  public Sub1(Main1 a){//this를 받아주는 파라미터
    System.out.println(main1);
    if(main1==null){
      System.out.println("main1은 null입니다. 객체생성 안된 상태임");
    }
    //Main1 mian1=null의 의미가 된다.
    //나는 언제 호출되나요?-메입앱이 실행될때
    //어디서 호출?-Main1클래스에서
    //왜 호출?-입력을 눌렀을때, 주문을 할 때, 회원가입을 할때
    this.main1=a; //this는 Sub1이다. 위의 this랑 다른애다. 전역변수의 초기화다.*******
    //객체 치환이 일어났다.
    initDiplay();//스태틱 아니니까 그냥 호출 가능
    
  }
  int insert(){//1.입력성공 0:입력실패
    // main1불가하다 insert 메소드에서 접근이 불가함
    return 1;
  }

  // public static void main(String[] args) {
  //   new Sub1(null);//
  // }

/*
 * 콜백 메소드라고 부른다
 * 저장버튼이 클릭되었을때 jvm이 이를 감자하고 인터셉트하여 메소드 호출을 해줌
 * 파라미터인 ActionEvent 객체를 통해서 이벤트가 감지된 버튼을 구분 할 수 있음
 * 이 객체는 파라미터에 있으므로 JVM으로부터 주입이 되는 객체이다.
 * 다시말해 개발자가 인스턴스화 하지 않고 JVM이 대신 해줌
 */
  @Override
  public void actionPerformed(ActionEvent e) {
    //너 저장버튼 누른거야
    Object obj =e.getSource();
    // 반복문을 탈출할때는 break사용
    // 조건문을 탈출할때는 return사용
    if(obj==jbtn){
      int result=insert();
      if(result==1){
        JOptionPane.showMessageDialog(jdg, "입력에 성공 하였습니다.");
        main1.refresh();
        jdg.dispose();//새로고침확인 누르면 서브창 꺼지게한다.
      }
        else if(result==0){
          JOptionPane.showMessageDialog(jdg, "입력 실패하였습니다.");
          return;//actionPerformed를 탈출함
        }
    }
    
  }
}

 

출력되는 위치에 따라서 void를 할것인지 int를 할것인지 나뉜다.

 

자바에서는 같은 이름의 메소드를 만들수 있다.

두가지 방법

1. 메소드 오버라이딩

2. 메소드 오버로딩

 

두가지 공통점

메소드이름이 같을 때만 따진다.

 

오버라이딩의 경우에는 서로 상속관계에 있거나 구현체 클래스일 경우에만 따진다.

관계가 없다면 상관하지 않는다.

 

 

 

 

연습하기

1-1

Ractangle.java

메인에서 처리하기

package dev_java.ch03.Practice;

public class RectAngle {
  //변수선언2개 - 가로길이, 세로길이
  //변수선언 1개 - 면적 구하기

  public static void main(String[] args) {
    int i=2;//가로
  int j =3;//세로
  int area=0;
  area=i*j;
    System.out.println("직사각형의 면적은?"+ area);
  }
  
}
/*
 * 1-1
 * 메인안에서 처리하기
 * 
 * 문제제기
 * 
 * 원의 면적도 구하고싶다면?
 * 삼각형의 면적도 구하고 싶다
 * 사각형도 구해야하면?
 * 
 * 이걸 모두 할 수있도록 3에서 만들어달라.
 * 
 */

1-2

Ractangle2.class

Ractangle2Main.java

Ractangle2Main.class

메소드를 꺼낸다.-사용자정의 메소드 구현

리턴타입을 결정하자

void일때를 증명하는 코드를 증명

int일때 

파라미터의 갯수를 나는 결정할 수 있다.

또 파라미터에 타입도 선택할 수 있다.-->해봐야 알수있다.

출력하기와도 관련이 있다.-어디에 출력? 과 관련이 있다.

package dev_java.ch03.Practice;

class RectAngle2{//둘다 퍼블릭일수는 없다. 퍼블릭이 없으면 friendly이다. 같은 패키지않에서는 공유. 임포트는 안된다.


  void area(int w,int h){
    int area=w*h;
    System.out.println("면적은" + area);
  }

  long area(long w, int h){ //타입 맞춰줘야 한다. 작은 타입을 큰타입에 넣는것은 언제나 합법. 자동 형전환. 반대는 강제 형전환
    // int result=w*h;
    // return result;
    return w*h;//이것도 가능
  }
}

public class RectAngle2Main {

  public static void main(String[] args) {
    RectAngle2 r2=new RectAngle2();
    r2.area(2,3);//값에 의한 호출. call by value
    System.out.println("면적은" + r2.area(2L,3));//int우선이라서 long값을 넣어줘야된다.
    

  }
  
}

1-3

Ractangle3.java

배열로 처리해보기

소스리뷰

1.1 과 1.2 비교해본다.

관전 포인트!

어떤 코드가 더 직관적인지

어떤 코드가 라인수가 더 많은지

어느쪽이 더 양이 많은가

양만 많은가

아니면 복잡도도 늘었나?

어느쪽이 재사용하기에 좋은가- 결합도가 높은 코드인가? 아니면 낮은 코드인가?

-> 이식성과도 관련이 있다.

 

파이는 더블타입으로 한다.

변수의 갯수 : 파라미터의 갯수

상수로 사용할 때에는 final로 한다. 바뀌지 않으니까.

메세지 오버로딩으로 여러 도형의 면적을 구한다.

package dev_java.ch03.Practice;
//배열쓰기

class RectAngle3{

  void rectangle(int params[]){
    params[2]=params[0]*params[1];
    System.out.println(params[2]);
  }

  void circle(int params[]){
    final double pi=3.14;
    double area=params[0]*params[1]*pi;
    System.out.println(area);


  }


  void triangle(int params[]){
    params[2]=params[0]*params[1]/2;
    System.out.println(params[2]);
  }

}

public class RectAngle3Main {

  public static void main(String[] args) {
    RectAngle3 r3=new RectAngle3();
    int arr[]={2,3,0};
    r3.rectangle(arr);
    r3.circle(arr);
    r3.triangle(arr);

  }
  
}

 

Quiz4

package dev_java.ch03.Practice;
/*
 * 연습문제 4
두숫자를 입력 받아 둘 사이의 3의 배수 갯수를 카운트 하는 프로그램을 작성하시오.
예) 3, 13 두 숫자를 입력하였다면 3개 출력해 줌
 */


public class Quiz4 {
  int cnt;//0 전변이 바뀐다. 원본이 바뀐다.
  int account(int start, int end){ //start=3, end=13
    for(int i=start; i<=end; i++){
      // for(int i=start; i<=end; i=i+3){//3,4,5,6,7
        cnt++;
    }if (i%3==0){
      cnt++;
    }
    return cnt;
  }
  public static void main(String[] args) {
    Quiz4 q4=new Quiz4();
    q4.account(3,13);
    System.out.println(q4.cnt);
    
  }
  
}

응용문제--도전중!

package dev_java.ch03.Practice;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class GradeView2 implements ActionListener{
  
//선언부
JFrame jf=new JFrame();
JPanel jp1=new JPanel();
JPanel jp2=new JPanel();
JPanel jp3=new JPanel();
JLabel jl_inwon=new JLabel("성적처리인원",JLabel.RIGHT);
JLabel jl_num=new JLabel("명",JLabel.LEFT);
JButton jb_make=new JButton("만들기");
JButton jb_cal=new JButton("연산");
JButton jb_sam=new JButton("3명샘플");
JButton jb_clear=new JButton("지우기");
JButton jb_exit=new JButton("종료");
JTextField jtf=new JTextField();




//생성자
public GradeView2(){
  initDisplay();
}

//화면구현부
public void initDisplay(){
  jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  jf.setSize(500,400);
  jf.setVisible(true);
  jf.setTitle("성적처리");
  jf.add("North",jp1);
  jf.add("South",jp3);
  jp3.add(jb_cal);
  jp3.add(jb_sam);
  jp3.add(jb_clear);
  jp3.add(jb_exit);
  jp1.setLayout(new BorderLayout());
  jp2.setLayout(new BorderLayout());
  jp1.add("East",jp2);
  jp1.add("Weast",jl_inwon);
  jp1.add("East",jl_num);
  jp1.add("Center",jtf);
  jp2.add(jb_make);
  




}

//메인메소드
public static void main(String[] args) {
  new GradeView2();
  
}




@Override
public void actionPerformed(ActionEvent e) {
  

}
  
}

 

내일 완성하자

댓글