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

12/09 국비학원 자바수업 10회차(equals, 다차원 배열)

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

equals 와 == 비교하기

 

1. == 비교를 위한 연산자

주소의 값을 비교합니다.(Call By Reference)
주소의 값이란 실제 내용의 값이 아닌 자료의 위치의 값이라고 생각하면 편하십니다.

 

2. equals() 메소드

equals() 메소드는 객체끼리 내용 비교합니다.(Call By value)

 

이퀄스의 상위에는 object클래스가 있다. 재사용성이 있다. 그러나 상속남발 금지^^

 

equals는 boolean타입이다.

 

if문 안에 조건식으로 들어갈수있고 for문 에도 들어간다. switch문 안에는 들어갈 수 없다.

 

클래스의 변수는 주소번지이다.

주소번지가 같은지를 비교하는것이다.

  String s1=new String("안녕");
    String s2=new String("안녕");
    String s3 ="안녕";
    String s4 = "안녕";
    if(s1==s2){
      System.out.println("주소번지가 같니?");
    }
    if(s1.equals(s2)){
      System.out.println("주소번지가 같니?");
    }
    if(s3==s4){//true 같은 안녕을 가져옴
      System.out.println("주소번지가 같니?");
    }
    if(s3.equals(s4)){
      System.out.println("주소번지가 같니?");
    }

주소번지가 가리키는 답이 갖은지 다른지를 알고싶다!

반드시 equals사용!!

 

s3==s4 참이다.true

 

String s라는 변수에 값을 할당했지만, 만약 값이 할당되지 않는다면

변수.equal() 부분 즉, s.equals("변수") 부분에서 nullexception이 발생하기 때문이죠.

 

if(str.equals("exit"))

이 형태 보다는 

"exit".equals(str) 이 바람직하다. 

 

자동정렬 단축키

ctrl+shft+f

 

삼항 연산자

 

if 문 대신에 ? 쓸수있다.

 괄호 안의 조건문이 참일 경우 int a에 50이 담기게 되고 거짓일 경우에는 40이 담기게된다

 

다차원 배열

 

1차배열에서는 값이나온다

2차는 주소번지나온다

length는 로우를 나타냄

 

2차원 배열은 다음과 같은 문법에 따라 선언할 수 있습니다.

문법
타입 배열이름[열의길이][행의길이]; //길이는 0부터 시작 안되겠지?

 

타입은 배열 요소로 저장되는 변수의 타입을 설정합니다.

배열 이름은 배열이 선언된 후에 배열에 접근하기 위해 사용됩니다.

 

다음 그림은 2차원 배열을 이해하기 쉽도록 도식적으로 표현한 그림입니다.

 

하지만 컴퓨터의 메모리는 위와 같은 입체적 공간이 아닌 선형 공간이므로 실제로는 다음 그림과 같이 저장됩니다.

 

http://www.tcpschool.com/c/c_array_twoDimensional

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 int arr[][]=new int [2][3];
    for(int i=0;i<arr.length;i++){//로우
      for(int j=0;j<arr[i].length;j++){//컬럼 [i]는 2차배열에서 값이 아니라 주소번지이다. 컬럼의 갯수를 뜻한다.

1차원 배열의 초기화 형태를 따르는 방식

C언어에서는 2차원 배열을 1차원 배열의 초기화 형태로도 초기화할 수 있습니다.

문법
타입 배열이름[열의길이][행의길이] = {배열요소[0][0], 배열요소[0][1], ..., 배열요소[1][0], 배열요소[1][1], ..., 배열요소[2][0], 배열요소[2][1], ...};

 

이 방식으로는 2차원 배열의 배열 요소[0][0]부터 차례대로 초기화됩니다.

만약에 초기화하는 배열 요소의 개수가 배열의 총 길이보다 적으면, 나머지 배열 요소는 모두 0으로 초기화됩니다.


배열의 모든 요소를 초기화하는 방식

C언어에서는 2차원 배열의 모든 요소를 초기화할 수 있습니다.

문법
타입 배열이름[열의길이][행의길이] =
{
    {배열요소[0][0], 배열요소[0][1], ...},
    {배열요소[1][0], 배열요소[1][1], ...},
    {배열요소[2][0], 배열요소[2][1], ...},
    ...
};

 

 

이 방식은 앞서 살펴본 1차원 배열의 초기화 형태를 따르는 방식과 결과는 똑같습니다.

하지만 좀 더 직관적으로 2차원 배열의 모습을 알 수 있으므로 보통 이 방식을 가장 많이 사용합니다.

 

배열을 사용하면 직관적이지 못할수도있다. 

생각하고 쓰기.

코드의 양은 줄어들어도 유지보수에 시간이 더 많이 쓰일수도 있다.

 

비주얼화 하기

view>array>ButtonArray2

 

 

한 화면에서 그리드 레이아웃과 보더 레이아읏을 같이 쓸 수 없다.

 

이벤트 처리 3단계

1. 이벤트 소스가 어떤 이벤트 리스너인지 찾아낸다.

2.재정의

3.

 

package dev_java.view.Array;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;//이벤트 리스너




public class ButtonArray2 implements ActionListener{//액션리스너를 쓰려면 임플리먼트 해야된다
//선언부
JFrame jf = new JFrame();//인스턴스화 함으로써 setSize(400,300);가로 세로 크기지정 setVisible(윈도우 창에 활성화 하기)
JPanel jp_center=new JPanel();

JTextArea jta_display= new JTextArea(10,20);
JScrollPane jsp_display=new JScrollPane(jta_display);
JTextField jtf_input=new JTextField();

JPanel jp_east=new JPanel();
JButton jbtn_new=new JButton("새게임");
JButton jbtn_dap=new JButton("정답");
JButton jbtn_clear=new JButton("지우기");
JButton jbtn_exit=new JButton("종료");
//생성자-디폴트생성자 
public ButtonArray(){
  System.out.println("디포트 생성자 호출");
  //이벤트 소스와 이벤트 처리를 하는 핸들러 클래스를 매핑하기
  jtf_input.addActionListener(this);
  jbtn_new.addActionListener(this);
  jbtn_dap.addActionListener(this);
  jbtn_clear.addActionListener(this);
  jbtn_exit.addActionListener(this);

  initDisplay();
}
//화면그리기
public void initDisplay(){
  System.out.println("화면그리기 호출");
  //윈도우 창 오른쪽상단끝에 x버튼 누르면 종료 후 가상머신과 연결끊기
  jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  jp_center.setLayout(new BorderLayout());
  jp_center.add("Center",jsp_display);
  jp_center.add("South",jtf_input);
  jp_east.setLayout(new GridLayout(4,1,2,2));
  jbtn_new.setBackground(new Color(255,255,255));
  jbtn_new.setForeground(new Color(125,100,123));
  jbtn_dap.setBackground(new Color(15,224,123));
  jbtn_dap.setForeground(new Color(0,0,0));
  jbtn_clear.setBackground(new Color(255,255,255));
  jbtn_clear.setForeground(new Color(0,0,0));
  jbtn_exit.setBackground(new Color(255,255,255));
  jbtn_exit.setForeground(new Color(0,0,0));

  jp_east.add(jbtn_new);//윈도우 창 내에 버튼 생성
  jp_east.add(jbtn_dap);
  jp_east.add(jbtn_clear);
  jp_east.add(jbtn_exit);

  jp_center.setBackground(Color.ORANGE);
  jf.add("Center", jp_center);
  jf.add("East", jp_east);
  jf.setSize(400,300);//스태틱이 아니다. 다트연산자로 처리
  jf.setVisible(true);
}
//메인메소드
  public static void main(String[] args) {
    new ButtonArray();
    
  }
  @Override
  public void actionPerformed(ActionEvent e) {
    // e.getsource는 이벤트가 감지되는 컴포넌트(JTextField)의 주소번지를 반환함
    Object obj = e.getSource();
    //너 새게임 할려구..?
    if(jbtn_new==obj){//주소번지 비교. 같은 주소면 이벤트가 일어난거다. 여기서 눌린거다
      jta_display.append("새게임을 시작합니다.\n");//디스플레이 표시에 글자를 갖다붙임
    }
    //너정답 볼래?
    else if (jbtn_dap==obj){
      jta_display.append("정답입니다\n"); //개행표시 : 엔터
    }
    //화면좀 지워줘
    else if(jbtn_clear==obj){
    jta_display.setText("");
    }

    //나 그만할래
    else if(jbtn_exit==obj){
      System.exit(0);
    }

    // 너 JTextField에서 엔터친거야?
    else if(jtf_input==obj){
      //사용자가 텍스트 필드에 입력한 문자열을 읽어 온다.
      String input=jtf_input.getText();
      jta_display.append(input+"\n");
      jtf_input.setText("");//자동으로 텍스트 입력 후 없애주는 역할
    }
  
    
  }
  
}

 

 

야구숫자게임 화면과 로직 분리하기

화면은 뷰와 로직으로 나누었다.

ranCom()이라는 게임을 돌릴때 화면은 뷰에 있고 게임은 로직에 있게 하고싶다.

 

분리가 안되면 디자이너가 화면 디자인 다 하고나서 코딩하면 나는 언제 코딩하지....?

 

그래서 분리가 중요하다.

분리하면 동시에 작업하니까.

 

월요일 질문하기

 

 

댓글