190118_Day9 복습, 삼항연산자, 클래스 객체 비교, 오토박싱 언박싱


//3조 발표 후 ~! 스위치문의 간결함!
package SwitchTest;

public class SwitchTest 
{
    public static void main(String[] args)
    {
        final int SEARCH = 1;
        final int INCREMENT = 2;
        final int DECREMENT = 3;
        final int EXIT = 4; // 상수형 final 변수라 대문자 변수명

        int su = 1;

        switch (su) {
            case SEARCH : System.out.println(" 검색 "); break; // case 뒤에 변수는 못넣고 상수만 넣을 수 있다.
            case INCREMENT : System.out.println(" 증가 "); break; 
            case DECREMENT : System.out.println(" 감소 "); break;
            case EXIT : System.out.println(" 종료 "); break;
        default:
            break;
        }
    } //main
}

복습

  • 배열

    • 한개의 변수명에 여러 개의 데이터를 저장하기 위해! 단, 데이터들은 같은 자료형

    • 통신할때, 데이터 관리가 매우 편해진다! 변수명 하나만 건내면 안에 내용 열개 백개를 보낼 수 있음

    • 여러 개의 데이터를 변수명 한 개를 사용해 전달, 배열 인덱스 사용 =>> for문 사용 : 전체 데이터를 검색!

    • 형식

      1. 배열선언과 초기화! =>> 프로그램내에 확정된 데이터가 있을 때 사용

        • 자료형 [] 배열명 = {value_list};
      //자료형 [] 배열명 = { 데이터1, 데이터2, 데이터3 };
      int [] nums = { 100, 200, 300 };
      // ㅁㅁㅁ 방을 만들고 그 안에 100, 200, 300을 넣어줌
      // 번지는 nums[0] nums[1] nums[2]
      1. 배열 객체 생성 =>> 프로그램 생성 중 데이터 입력

        • 자료형 [] 배열명 = new 자료형 [배열 크기] //형식은 꼭 외워줘!
      int [] nums = new int [3];
      nums[0] = 10;
      nums[1] = 20;
      nums[2] = 30;
      1. 2차원 배열 객체 생성

        • 자료형 [] [] 배열명 = new 자려형 [행크기] [열크기];
      int [][] nums = new int [3][2]; //3*2 : 6개의 정수데이터 입력 준비
      num[0][0] = 10;
      num[0][1] = 20;
      
      num[1][0] = 30;
      num[1][1] = 40;
      
      num[2][0] = 50;
      num[2][1] = 60;
    10 20
    30 40
    50 60

    java
    int [][] nums = new int [3][]; //가변길이열
    //ㅁㅁ nums[0] = new int[2];
    //ㅁㅁㅁ nums[1] = new int[3];
    //ㅁ num[2] = new int[1];

  • newA();

    • 100 + 200
    • new A().hello();
  • A a = new A();
    • 변수 su + 200
    • a.hello();
  • A [] aa = new A[5];
    • 배열 su[0] + 200;
    • aa[0] = a;
    • aa[0].hello();

어제 미션

//mission 내가 푼것
package mission;

public class Mission0417
{
    public static void main(String[] args)
    {
        int su[] = { 1, 2, 3, 4, 5};
        // 배열 크기 (su.length) =>> 5

        System.out.println("================<1번>===============");
        for( int i = 0; i < su.length; i++ )
        {
            System.out.print(su[i] + "\t");
        }
        System.out.println();
        System.out.println("================<2번>===============");
        for( int i = su.length - 1 ; i >= 0; i-- )
        {
            System.out.print(su[i] + "\t");
        }
        System.out.println();
        System.out.println("================<3번>===============");

        int su2[][] = { { 1 }, { 1, 2 }, { 1, 2, 3 } };
        for( int i = 0; i < su2.length; i++)
        {
            for( int j = 0; j <= su2[i].length - 1; j++)
            {
                System.out.println("su[ " + i + " ] [ " + j + " ] = " + su2[i][j]);
            }
        }

        System.out.println();
        System.out.println("================<4번>===============");

        int su3[] = {5, 5, 5, 5, 5}; 
        for ( int i = 0; i < su.length; i ++)
        {
            su3[i] = su[i];
        }
        System.out.println(su[2]);
        //이거 원본도 한번 출력해 보자!

        System.out.println();
        System.out.println("================<5번>===============");

        int temp;
        temp = su[0];
        su[0] = su[4];
        su[4] = temp;

        temp = su[1];
        su[1] = su[3];
        su[3] = temp;

        temp = su[0];
        for (int i = 0; i < su.length; i++)
        {
            System.out.print(su[i] + "\t");
        }


        System.out.println();
        System.out.println("================<6번>===============");

        temp = su[0];
        su[0] = su[4];
        su[4] = temp;

        temp = su[1];
        su[1] = su[3];
        su[3] = temp;

        temp = su[0];
        for (int i = 1; i < su.length; i+=2)
        {
            System.out.print(i+ "번지" + "\t");
        }

        System.out.println();
        System.out.println("================<7번>===============");

        temp = su[0];
        for (int i = 0; i < su.length; i+=2)
        {
            System.out.print(su[i] + "\t");
        }
    }
}
//선생님 해설
//mission
package MissionA;

class A
{
    void hello()
    {
        System.out.println("안녕");
    }
}

public class MissionA
{
    public static void main(String[] args)
    {

        int su[] = { 1, 2, 3, 4, 5, 60};
        // 배열 크기 (su.length) =>> 6

        A a = new A();
        a.hello();
        a.hello();
        System.out.println("=================");

        new A().hello();
        new A().hello();
        System.out.println("=================");





        A []arr = new A[3];
        //A [] arr = {null, null, null};
        arr[1] = new A();
        //A [] arr = {null, new A(), null};

//        arr[0].hello(); 아직 arr[0]이 할당 못받았다. NullPinterException 발생
        arr[1].hello();
        System.out.println( "arr 배열 크기 : " + arr.length );

//      int []su = { 1, 2, 3, 4, 5 };
        //인덱스               0  1  2  3  4

        //arr.length ? =>> 0, 3
        System.out.println("\n===============");
        System.out.println("문제 1");

        for (int i = 0; i < su.length; i++) 
        {
            System.out.print( su[i] );
            if(i < 4)System.out.print(", ");
        }

        System.out.println("\n===============");
        System.out.println("문제 2");

        for (int i = su.length-1 ; i > -1; i--) 
        {
            System.out.print( su[i] );
            if(i>0)System.out.print(", ");
        }        

        System.out.println("\n===============");
        System.out.println("문제 3");
        //2차원 배열을 다중for문을 통해 출력
        //행              0        1           2
        int su2[][] = { { 1 }, { 1, 2 }, { 1, 2, 3} };
        //열              0      0   1     0   1  2
        for( int i = 0; i < su2.length; i++ ) // 기준 : 행 인덱스
        {
            for( int j = 0; j < su2[i].length ; j ++ ) //각 행의 열 인덱스
            {
                System.out.println("su2[" + i + "][" + 0 + "]번지 = " + su2[i][j]);
            }
        }

        System.out.println("\n===============");
        System.out.println("문제 4");

        int su3[] = new int[ su.length ]; // new int[5]


        su3 = su; // su3과 su는 참조변수이다.(속성변수가 아닌) , 이는 메모리 값의 주소! 주소 값을 전해준다.
        //su3[2] = 33; // 이렇게 해버리면 원본까지 바뀌어 버린다.

        for (int i = 0; i < su3.length; i++)
        {
            System.out.println("su3[" + i + "] = " + su3[i]);
        }

        System.out.println("원본출력");
        for (int i = 0; i < su3.length; i++)
        {
            System.out.println("su[" + i + "] = " + su[i]);
        }

        //원본까지 바뀌지 않기 위해
        for (int i = 0; i < su.length; i++)
        {
            su3[i] = su[i];
            System.out.print(su3[i]);
            if(i <4 )System.out.print(", ");
        }
        /*출력값
        문제4)
su3[0]=12
su3[1]=2
su3[2]=33
su3[3]=4
su3[4]=5
su3[5]=65
===원본su배열출력===
su[0]=12
su[1]=2
su[2]=3
su[3]=4
su[4]=5
su[5]=65
        */
        System.out.println("\n===============");
        System.out.println("문제 5");

        //데이터 교환
        //int j = 4; //교환할 오른 쪽 데이터 인덱스 4 3 
        int temp;
        for(int i = 0, j = su.length - 1 ; i < su.length/2; i++, j--) //교환할 왼쪽 데이터 인덱스 0, 1
        {
            temp = su[i];
            su[i] = su[j];
            su[j] = temp;

            //j--;
        }

        for(int i = 0; i < su.length; i++)
        {
            System.out.println("su[" + i + "] = " + su[i]);
        }

        /*
        문제5)
su[0]=65
su[1]=5
su[2]=4
su[3]=3
su[4]=2
su[5]=12

        */
        System.out.println("\n===============");
        System.out.println("문제 6 홀수번지 출력하기");
        for (int i = 0; i < su.length; i++)
        {
            if(i%2==1)//홀수번지 (==인덱스) 조건
                System.out.println( "su["+i+"] = " + su[i]);
        }

        System.out.println("\n===============");
        System.out.println("문제 7 홀수번지 출력하기");
        for (int i = 0; i < su.length; i++)
        {
            if(su[i]%2==1)//홀수데이터값 조건
                System.out.println( "su["+i+"] = " + su[i]);
        }


    }//main    
}

<삼항연산자>

  • 형식

    조건식 ? A : B
    (조건식) ? A : B
    => 조건식의 결과가 true였을 때 A리턴, 결과가 false였을 대 B리턴
  • 사용 예)

    boolean b =  (3<4)  ?  true  : false;
    //  ==> b변수에 true 저장
    
    int su=1;
    String gender =  su%2!=0  ?  "남자"  : "여자";
    //  ==> gender변수에 "남자" 저장
    
    int su2 =  ('남' == '여')  ?  100  : 300;
    //  ==> su2변수에 300 저장

<클래스 객체 비교>

  • 클래스 참조변수 == 클래스 참조변수2 =>> 메모리 주소 비교

    A a1 = new A(); 
    A a2 = new A();
    System.out.println(a1 == a2)
      //결과값 false : 서로 다른 메모리 주소
    
    a2 = a1 //a1이 갖은 주소를 a2에 전달
    System.out.println(a1 == a2)
      //결과값 true : 서로 같은 메모리 주소
  • 위와 비교해서 참고

    • 속성변수1 == 속성변수 =>> 데이터 값 비교!
    int su1 = 30;
    int su2 = 30;
    System.out.println(su1==su2)
    //결과값 true : 값은 값을 갖는다.
int su1; // 속성변수 (기본 자료형으로 선언된 변수)
su1 = 100;
su1.~ (x)

Integer su2; // 참조변수!! (데이터의 위치는 메모리이고 그 메모리의 주소를 담는 변수!)
su2 = new Integer(100);
su2.~ (o)

오토박싱 언박싱

  • JDK 5버전 이후 지원
  • int, double과 같은 기본형 자료형의 포장 클래스가 있어, 기본형을 객체로 다루어야 할 경우에 사용 가능
  • 포장하는 클래스, 기본 자료형을 포장한다!
  • 자바의 모든것은 객체?! =>> 객체가 아닌것들도 존재 =>> 기본 자료형(빈번한 연산을 하기 위해 높은 성능을 위해 객체화 하지 않은 듯?!)
  • 객체가 아니어서 컬렉션 또는 다형성 제네릭 이용시에 불편!
  • 그래서 래퍼 클래스를 사용한다!
  • 기본자료형과 래퍼간 == 연산과 equals연산 모두 성립.
  • 하지만 래퍼와 래퍼 사이는 equals 성립, == 성립 안함. 단 대소 비교 > < 가능
int su3 = new Integer(300);
Integer su4 = 300;
  • 기본자료형 래퍼클래스 (위치: 기본패키지 java.lang)
    byte —-> Byte
    short —-> Short
    int —-> Integer (정수와 관련된 속성,메소드를 지원하는 클래스)
    long —-> Long
    float —-> Float
    double —-> Double
    char —-> Character
    boolean —-> Boolean

  • 생성자는 위와 같이 해당하는 기본형을 줄 수도 있고 문자열로 줄 수도 있다. 문자열로 주는 경우 형식에 맞아야 함

  • 근데 래퍼클래스 사용시 참조형끼리 연산 불가… 다시 자료형으로 변환하여 연산…

  • 그래서 오토박싱과 언박싱이 등장!

  • 오토박싱은 기본자료형을 래퍼클래스로 감싸주지 않아도 박싱

    Integer k = 2; // 내부적 동작 Integer a = new Integer(2);
    Object L = 2 // Object o = new Integer(2) 로 동작, 다형성
  • 언박싱은 기본자료형으로 변환 안해도 포장을 풀어줌

    Integer k = new Integer(2);
    int i = a; // 내부적으로 int i = a.intValue(); 로 동작
  • 박싱이라는게 기본형->참조형 변환

  • 언박싱은 참조형-> 기본형 변환

  • 래퍼클래스 이용하여 문자열을 기본 자료형으로 변환 가능, 문자열을 래퍼클래스로 변환 가능

궁금상자
- 배열은 같은 자료형으로 모여야 하는데 , 그럼 2차원 배열에서 안에 배열은 스트링 밖에 배열은 숫자 이렇게도 가능할까?

- boolean 기본 값 false? char 는 '/u0000' 맞나?
for(int i = 0; i < su.length; i++)
    {
        for ( int j = 0; j < i; j++)
        {
            if(su[i] == su[j])
            {
                su[j]--;
                break;
            }   
        }
    }

+ Recent posts