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

12/19 국비학원 자바수업 16회차(단일책임원칙, Vector)

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

프로그램이 하는 일은 데이터를 처리하는것이다.

클래스 하나는 기능 하나만 갖게 해야한다.

 

 

 자바의 데이터 타입에는 크게 기본 타입 (원시 타 입 primitive type) 과 참조 타입 (Reference type) 으로 분류된다.

기본 타입이란 정수 실수. 문자 논리 리터럴을 저장하는 타입을 말한다. 참조 타입이란 객체 (Object) 의 주소를 참조하는 타입으로 배열 열거‘ 클래스‘ 인터페이스 타입을 말한다.

 

1. 주소번지를 비교

2. 주소번지가 가르키는 값을 비교===>euals로 비교

 

생성자를 통해서 초기화 한다.

출처 : 이것이 자바다

 

package dev_java.week4;

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

import javax.swing.JButton;
import javax.swing.JFrame;

class Button1 extends JFrame{
//선언부
//게으른 인스턴스화
//북쪽배치
JButton jbtn_ins=null;//선언만 했다. 생성자 호출 안된다.
//이른 인스턴스화
//남쪽배치
JButton jbtn_upd= new JButton("수정");//선언 및 생성 동시에 생성자 호출까지
//생성자
Button1(){
  System.out.println("Button1디폴트 생성자 호출"+jbtn_ins);//버튼 완성 전에 실행되서 null이다.
  //생성자 안에서 버튼 객체를 생성하면 뭐가 다르지? 어떻게 다른지?-시점에 따라 NullPointerException
  initDisplay();//new Button1이 호출 되면 자동으로 호출이 일어남
  System.out.println("initDisplay호출 후"+(jbtn_ins==null));
  jbtn_ins=new JButton("입력");//initDispaly랑 순서바꾸니까 입력버튼에서 널익셥뜸
  System.out.println("입력버튼 생성 후=====");
}

//화면처리부
  public void initDisplay(){
    //동쪽배치
    JButton jbtn_del=new JButton("삭제");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.add("North",jbtn_ins);
    this.add("South",jbtn_upd);
    this.add("East",jbtn_del);
    this.setSize(400,300);
    this.setVisible(true);
  }

}
//ActionListener의 구현체 클래스이다.-이벤트 핸들러 클래스이다.
//인터페이스는 추상 메소드만 가진다.
class Button1Event implements ActionListener{

  @Override
  public void actionPerformed(ActionEvent e) {
    Object obj=e.getSource();
    
  }

}
public class Button1Main {
  public static void main(String[] args) {
    Button1 b1=new Button1();
    // Button1 b2=new Button1();
    // Button1 b3=new Button1();//화면 세개 열린다. 각각 다른 복제본 객체
    
  }
}

게으른 인스턴스화 했을때 이렇게 nullPointException이 생길수 있다 그러므로 주의해야된다.

순서도 중요하다.

//화면처리부
  public void initDisplay(){
    //동쪽배치
    JButton jbtn_del=new JButton("삭제");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    if(jbtn_ins!=null){//if문은 흐름을 바꾼다.
      this.add("North",jbtn_ins);
    }
  
    this.add("South",jbtn_upd);
    this.add("East",jbtn_del);
    this.setSize(400,300);
    this.setVisible(true);
  }

}

그래서 if문으로 예외처리를 해주었다. 

문제 없이 화면이 잘 구현이 되는것을 확인 할 수 있다.

 

객체지향 프로그래밍의 5가지 설계 원칙

https://mangkyu.tistory.com/194

 

[OOP] 객체지향 프로그래밍의 5가지 설계 원칙, 실무 코드로 살펴보는 SOLID

이번에는 객체 지향 프로그래밍의 5가지 핵심 원칙인 SOLID에 대해 알아보고자 합니다. 실제로 애플리케이션을 개발할 때 어떻게 적용할 수 있을지 구체적인 예시를 들어 살펴보고자 합니다. 아

mangkyu.tistory.com

1. 객체지향 프로그래밍의 5가지 설계 원칙, SOLID


SOLID란 객체 지향 프로그래밍을 하면서 지켜야하는 5대 원칙으로 각각 SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), DIP(의존 역전 원칙), ISP(인터페이스 분리 원칙)의 앞글자를 따서 만들어졌다. SOLID 원칙을 철저히 지키면 시간이 지나도 변경이 용이하고, 유지보수와 확장이 쉬운 소프트웨어를 개발하는데 도움이 되는 것으로 알려져있다.

 

[ 단일 책임의 원칙(SRP, Single Responsibility Principle) ]

단일 책임의 원칙(SRP, Single Responsibility Principle)은 하나의 모듈은 한 가지 책임을 가져야 한다는 것으로, 이것은 모듈이 변경되는 이유가 한가지여야 함을 의미한다. 여기서 변경의 이유가 한가지라는 것은 해당 모듈이 여러 대상 또는 액터들에 대해 책임을 가져서는 안되고, 오직 하나의 액터에 대해서만 책임을 져야 한다는 것을 의미한다.

만약 어떤 모듈이 여러 액터에 대해 책임을 가지고 있다면 여러 액터들로부터 변경에 대한 요구가 올 수 있으므로, 해당 모듈을 수정해야 하는 이유 역시 여러 개가 될 수 있다. 반면에 어떤 클래스가 단 하나의 책임 만을 갖고 있다면, 특정 액터로부터 변경을 특정할 수 있으므로 해당 클래스를 변경해야 하는 이유와 시점이 명확해진다.

 

메인에서 Button1의 생성자 호출-----가장중요!!

연습을 충분히 하기

언제 어디에 무엇을 인스턴스화 하고 생성자는 파라미터 몇개인지 선택 결정 할 수 있어야한다.

 

인스턴스화 위치 중요

this도 넘겨야된다.

this는 Button1이다.

버튼 이벤트쪽에서 필요하다. 그러기 위해 this로 넘겨주자

this는 자기 자신을 가리키는 인스턴스이다. 하나의 원본이다.

의존관계는 메인은 ui필요하고 ui는 이벤트 필요하다.

순환구조가되면 서버가 터진다.

한쪽이 인스턴스화 해서 쓸 수 있도록 해야된다.

설계가 상당히 중요하다.

설계 시 중요한것은 객체사이에 관계를 잘 파악한다.

 

상속, 추상클래스 중심, 인터페이스 중심의 코딩 전개해야

머져? 4수준이 먼지...?

 

class Button1Event implements ActionListener{
  Button1 button1 = null;
  public Button1Event(Button1 button1){
    this.button1=button1;
  }

this 쓰는게 핵심이다....!

 

에러의 종류

1. 컴파일 에러

-컴파일 단계에서 오류발견, 컴파일러가 에러 메세지 출력

-문법오류때문에 발생

 

2. 런타임 에러

-프로그램 실행 중 에러발생

-문법오류는 아님

-~Excetion에러

-예외처리로 해결

 

3. 논리에러

-컴파일, 런타임 모두 정상 하지만 결과가 예상과 달라 의도 작업 수행 못함

-에러메세지 없어 수정 어려움

 

Q. 왜 this를 넘겨야 하나요?? 입력 할건데....

 

JTable7Dialog에 받아주는 생성자가 필요하다.

여기를 확인해보자!!

 

 

Vector

//2중[ outtwr:=Vector-size,inner:=String[]-length] for문 돌림

제공되는 API를 최대한 활용하는 방식으로 공부하기!

벡터.size 는 로우의 수를 나타낸다

배열.length는 컬럼의 수를 나타낸다

 

벡터 수정하기

package dev_java.week4;

import java.util.Arrays;
import java.util.Map;
import java.util.Vector;

public class Vector21 {
  public static void main(String[] args) {
    //2중[ outter:=Vector-size,inner:=String[]-length] for문 돌림
    //끼워넣기 가능, 수정 대한 API제공은 없다.-클라우드 기반 데이터베이스 제품 이런식....
    Vector<String[]> v=new Vector<>();
    Vector<Map<String,Object>> v3=new Vector<>();//실무사용 패턴-완결편
    String imsi[]={"10","개발부","뉴욕"};
    v.add(imsi);
    imsi=new String[]{"20","총무부","인천"};
    System.out.println(Arrays.toString(imsi));//imsi가 대체된것을 알수있음
    v.add(imsi);
     for(int x=0;x<v.size();x++){//로우의 수-2번 반복
      for(int y=0;y<imsi.length;y++){//컬럼의 수-3번 반복
        String[] r=v.get(x);
        System.out.println(r[y]+" ");
      }
      System.out.println();//줄바꿈 약속
    }
    //크기가 얼마인가요?0
    //단일 for문 처리
    Vector<String[]> v2=new Vector<>();
    
  }
  
}

댓글