8 분 소요

리뷰

[할 수 있어?]

  1. MethodCallTest라는 자바클래스를 만드시오.
  2. “안녕, 유플러스^o^”를 콘솔화면에 출력하시오.
  3. A클래스를 만들고 내부에 hello() 메서드를 만드시오.
  4. main()에서 hello()메서드를 호출하시오
  5. MethodCallTest에 good()메서드를 만들고 main()에서 호출하시오.

image-20240611101339046

Cannot make a static reference to the non-static method good() from the type MethodCallTest

  • static 메서드란?

    객체 생성 없이 호출 가능한 메서드

image-20240611102526660

같은 패키지 안에 같은 이름의 class를 생성할 수 없습니다.

그렇지만 클래스 안에 내부 클래스의 이름은 중복이 가능합니다.

속성변수

  • 속성 변수란?

    데이터 값(value)을 담는 변수

    • 자료형 변수명; 의 형태를 가집니다.

      • 여기서 자료형은 byte, short, int, long, float, double, char, boolean

      int no; : no에 정수를 담겠다! no=300; ➡ 자료형이 int이고 변수명이 no인 변수에 300을 담음.

      System.out.println(no); //300
      System.out.println(no + 200); //500
      System.out.println(no.); //에러 발생
      

참조변수

  • 참조변수란?

    데이터 주소(address)를 담는 변수

    • 자료형 변수명; 의 형태를 띕니다.

      • String, Integer, A, NameMenu, Person 등
      class A{
          int su=100;
          void hello(){
              ...
          }
      }
      //A a; => a에 주소를 담겠다. 
      A a = new A();
          
      System.out.println(a.su);
      System.out.println(a.hello());
      

데이터 저장 유형

만약 정수 100을 데이터 저장을 한다고 가정하면 다양한 곳에 저장이 가능합니다.

  1. 변수

    int su = 100;
    System.out.println(su);
    
  2. 배열

    int [] su = {100};
    System.out.println(su[0]);
    
  3. 클래스

    class A{
        int su=100;
    }
    A a = new A();
    System.out.println(a.su);
    ---------------------------
    class A{
        private int su=100;
        public void setSu(int su){
            this.su=su;
        }
        public int getSu(){
            return su;
        }
    }
    A a= new A();
    System.out.println(a.getSu());
    

값 복사

int su1;
int su2;
su1 = 100; //su1: 100
su2 = su1; //su1:100 su2:100
su1 = su1*200; //su1:20000 su2:100

주소 복사Ⅰ

A a1;
A a2;
a1 = new A();//객체생성식
a1.su = 100; //a1.su:100
a2.=a1 //a1.su:100 a2.su:100 
    
a1.su=a1.su*200 //a1.su:20000 a2.su:20000

a2.=a1은 값을 삽입하는 것이 아니라 값에 접근할 수 있는 주소를 공유하는 것

주소복사Ⅱ

A a1;
A a2;
a1 = new A();
a1.su = 100; //a1.su:100

a2 = new A();
a2.su = 100; //a1.su: 100 a2.su:100
a1.su=a1.su*200 //a1.su: 20000 a2.su: 100

이 경우 객체를 각각 생성해 주어서 주소 공유가 아니라 각각의 주소가 존재한다.

배열

배열이란?

  • 자료형이 동일한 데이터들에 같은(한개의) 변수명을 정의한 자료들의 집합

    • 자료형이 동일한 데이터들 => 조건
    • 같은(한개의) 변수명을 정의 =>특성
    • 자료들의 집합 => 정의

    int su1;: 한 개의 정수를 저장할 준비

    int [] su2;: 여러개의 정수를 저장할 준비

  • 데이터 관리가 편하다.

    • 여러 개의 데이터를 변수명 한 개를 사용해 전달

      배열인덱스 사용 ➡ for문 사용: 전체 데이터를 검색

  • 서로 데이터들을 구분하기 위해 번지를 사용한다.

  • 시작 번지는 0번지, 1씩 증가하는 번지를 가진다.

  • 배열의 크기가 정해지면 인덱스를 벗어나는 참조를 하면 안된다.

    int [] su3 = {10,20,30};

    ​ 인덱스=> su3[0], su3[1], su3[2]

    ​ 배열의 크기(요소 갯수): 3

     System.out.println(su3[1]);//데이터 사용 (두번째데이터 출력) 
      System.out.println(su3[3]); 
       ===> 에러발생: ArrayIndexOutOfBoundsException!!
    

int su1 = 11;

int su2 =22;

int su3 = 33;

➡ int [] su ={11, 22, 33};

각각 하나에 저장하는 방법 말고도 이렇게 배열을 사용해서 저장해 놓고 사용 가능!

데이터를 구분하기 위해서 배열을 사용한다면 su라는 배열변수에 복수 데이터를 대입하면 된다.

int su; ➡ 한 개의 데이터 입력

int [] su; ➡ 여러 개의 데이터 입력(배열)

boolean [] b = {true , false , true};
String [] str = { “길동” , “라임” , “주원” };
char []ch ={ ‘j’ , ‘a’, ‘v’, ‘a’}

[5000 데이터 출력]

System.out.println(5000);
//int
int su = 5000;
System.out.println(su);
//배열
int [] suArr = {5000};
System.out.println(suArr[0]);
  • 배열의 크기(배열의 요소 갯수)를 구하는 속성

    배열명. length

    배열은 객체이다.

  • 배열 선언 시 []는 변수명 앞에 또는 뒤에 붙여도 상관없다.

    • int [ ] su; = int [ ] su;
  • 기본 자료형을 선언 할 때, int i;, int j;, int k;int i,j,k;은 같다. 그렇다면 배열과 어떤 차이가 있을까?

    차이점

    int su1 [],su2;

    ➡su1은 배열, su2는 int 변수

    int [] su1,su2

    ➡su1, su2 둘 다 int 배열

     class A{
             int i; //기본값 존재O(값을 넣지 않더라도 클래스 안에 선언된 멤버변수는 기본값이 존재합니다.)
           
             void hello(){
                int j; //기본값 존재X(메소드 내에 선언된 지역변수, 메소드가 종료되면 자동 소멸됩니다.)
                System.out.println(i); //출력?  0
                  
                System.out.println(j); //출력? (초기화하지 않았다는)에러발생   
                j=0;
                System.out.println(j); //출력? 0
                  
                int a,b,c=0;
                System.out.println(c); //출력? 0 
                  
                System.out.println(a); //출력? (초기화하지 않았다는)에러발생
                System.out.println(b); //출력? (초기화하지 않았다는)에러발생
                   
                ==> int a=0,b=0,c=0;  //각각 초기화
                System.out.println(c); //출력? 0            
                System.out.println(a); //출력? 0
                System.out.println(b); //출력? 0
             }//hello     
         }
    

배열 형식

  1. 자료형 [ ] 배열명 = {데이터 List(콤마로 구분되는 데이터)};

    • 배열 선언과 동시에 데이터를 초기화 ➡ 이미 데이터가 확정되었을 때 사용

      ※주의: 배열선언과 데이터 초기화하는 부분을 따로 작성할 수 없음!!

        int [] su;//배열선언
               su = {1,2,3,4,5}; //배열초기화   (X)
             
        int []su = {1,2,3,4,5}; //선언과 초기화 (O)
             
        A a = new A();
         A []su2 = { a,  new A(), new A() };
      

      배열은 배열 객체이다. 클래스와 동일하다고 생각하면 된다.

  2. 자료형[] 배열명 = new 자료형[배열크기]; ➡ ⭐배열 객체 생석식⭐

  • 프로그램 실행 도중 데이터 값을 입력할 때(변경 할 때) 주로 사용
    • 데이터가 정해지지 않고 앞으로 입력받을 데이터들이 저장될 방(공간)만 준비
  • 배열 선언과 데이터 초기화하는 부분을 따로 작성하는 것이 가능
  • 배열 크기[]는 반드시 자료형 뒤에 위치해야 함
  • 배열 크기에 정수값이 반드시 입력되어야함
   int [] su; //배열 선언
   	su =  new int[5];
   //데이터 입력
   su[0]=11;
   su[1]=22;
   su[2]=33;
   su[3]=44;
   su[4]=55;
   
   su[5]=66; //인덱스를 벗어났으므로 에러발생

※배열 객체생성(위의 2번)을 하게 되면 그 위치에 상관없이 각방에는 초기값이 부여됨.

멤버변수 처럼 각 자료형의 기본값이 입력됨

2차원 배열

실제 저장은 1차원 배열과 같으나 논리적으로 데이터를 행과 열의 형태로 저장한다고 표현

  • 열 사이즈는 생략하는 것이 가능하나 행 사이즈는 반드시 기술해야 한다.

    int [][] su;
    int su [][];
    int []su[];
    
      0 열 1열 2열
    0행 1 2 3
    1행 4 5 6
    System.out.println(su[0][2]); //0행2열 데이터 ==> 3
    System.our.println(su[1][1]); //1행1열 데이터 ==> 5
      
    su.length //행의 갯수:2
    su[0].length //0행의 열의 갯수:3
    su[1].length //1행의 열의 갯수:3
          
    for(int i=0; i<su.length; i++){
        for(int j=0; j<su[i].length; j++){
            System.out.println(su[i][j]); //su배열 i행 j열
        }
    }
    

배열 연습문제

int [] su ={1,2,3,4,5};

문제1)

위 배열의 데이터를 차례대로 출력하시오.


image-20240611131738021image-20240611140833204

문제 2)

위 배열의 데이터를 역순으로 출력하시오. (4번지~0번지)


image-20240611131837967

문제3)

int su2[][]={ {1}, {1,2}, {1,2,3}}; su2배열의 데이터를 번지값과 함께 출력하시오. —> 예) su2[0][0]번지 = 1 행 열


image-20240611132218311

문제4)

su3 이라는 배열을 새롭게 만들어서 [예시]su배열의 값을 복사하시오.
su3 = su; (X)
su3[2]=33; System.out.println(su[2]); // 3 출력


image-20240611133437140

문제5)

[예시]su배열을 —-> for문을 통해 [0]번지~[4]번지까지 출력을 했을때 5 4 3 2 1 과 같이 출력되도록 하시오.
—-> [0]번지와 [4]번지 데이터 교환
[1]번지와 [3]번지 데이터 교환 후 출력!!


image-20240611134304563image-20240611134320321

문제6)

su배열의 홀수번지를 출력하시오. su[1] su[3] su[5] su[7]…… 2 4 65


image-20240611134614537image-20240611134623712

문제7)

su배열의 홀수값을 출력하시오. 1 3 5 7 65


image-20240611134737432image-20240611134746972

문제8) :앞쪽_화살표:입력값 0 1 0 0 1 1 3 5 ==> 8개의 정수데이터가 두줄에 입력된다. 이 입력된 값을 arr[ ]배열에 저장하자.


예외

  • 예외(Exception)란?

    프로그램 실행 중 발생하는 예기치 않은 사건을 말한다.

    • 예외 발생 시 어떤 처리(대응)를 할지 추가 코드 작성

      예외처리: 자바언어를 더욱 강하게 만드는 요소로 개발자 입장에서는 코드량이 증가하지만 사용자 입장에서는 신뢰성있는 프로그램이 된다.

      void hello() throws Exception{ //throws Exception으로 예외처리 전가
          문장1;
          문장2;
          문장3;
      }
      

      이렇게 hello() 메소드를 예외처리 전가를 시키면 hello() 메소드를 호출하는 메소드에서 예외처리 하도록전가하는 것이다.

예외처리 구문Ⅰ

  • try~catch문

    void hello(){
        try{
            문장1;//AException 발생 가능
            문장2;
            문장3;//BException 발생 가능
        }catch(AException){
            //AException 발생 시 실행문장;
        }catch(BException){
            //BException 발생 시 실행문장;
        }
    }
    

예외처리 구문Ⅱ

  • finally 블럭

    void hello(){
        try{
            문장1;
            문장2;//AException 발생 가능
            문장3;
            문장4;//BException 발생 가능
        }catch(AException){
            문장6;
        }catch(BException){
            문장7;
        }finally{
            문장5;
        }
    }
    
    • 정상 실행(예외발생 안함)

      ➡1; 2; 3; 4; 5;

    • AException 발생

      ➡1; 6; 5;

    • BException 발생

      ➡1; 2; 3; 7; 5;

    즉, finally블럭을 사용하면 반드시 실행한다.

예외 종류

  1. 체크(Checked)예외

    public static void main(String[] args){
        System.in.read();
        //에러: Unhandled exception type IOException
    }
    
    • 컴파일 에러 발생
    • 명시적으로 발생할 수 있는 예외에 대한 처리를 강요
    • 반드시 try~catch 또는 throws를 사용해야함
  2. 언체크(UnChecked)예외

    public static void main(String[] args){
        String [] name = {"길동", "주원"};
        System.out.println(names[3]); //배열의 인덱스를 넘어서 에러 발생
    }
    
    • 개발자 실수 또는 사용자 입력데이터 예외
    • 컴파일시 에러가 발생하지 않는다.
    • RuntimeException을 상속받는 예외
    • try~catch 또는 throws 사용 가능
    • if문을 통해 처리가능

더하기

import

현 클래스와 동일한 패키지에 있는 클래스 또는 기본 패키지에 있는 클래스는 바로 사용 가능

java.lang ➡ 기본 패키지

이외의 클래스는 import가 필요

  • import는 클래스 위치를 표현하는 방법

개선된 for문(forEach문)

for문을 활용할 때, 인덱스는 필요 없고 오로지 데이터만 필요할 때 사용한다.

for(자료형 변수명 : 배열명){

}

int [] su = {1, 2, 3, 4, 5};
for(int data: su){
    System.out.print(data);
}
=> 12345

복사

  • 얕은 복사

    int [] su = {1, 2, 3, 4, 5};
    int [] su3;
    su3 = su;
    

    배열의 주소를 복사해서 동일한 메모리를 su3과 su가 참조한다.

  • 깊은 복사

    다른 메모리를 할당, 배열 각가의 번지내의 데이터를 복사

    int [] su = {1, 2, 3, 4, 5};
    int [] su3; 
    for(int i=0; i<su.length; i++) {
         su3[i]=su[i];
    }
    
    • Object.clone()

      int [] su = {1, 2, 3, 4, 5};
      		int [] su3 = su.clone();
      		for(int i=0; i<su.length; i++) {
      			System.out.print(su3[i]);
      		}
      => 12345
      
    • System.arraycopy()

      ➡ 속도가 빠르다

      System.arraycopy(원본배열, 원본 배열의 복사 시작 지점, 복사할 배열, 복사할 배열의 복사 시작 지점, 복사할 요소의 개수)

      System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
      
      int [] su = {1, 2, 3, 4, 5};
      		int [] su3 = new int [su.length];
      		System.arraycopy(su, 0, su3, 0, su.length);
      		for(int i=0; i<su.length; i++) {
      			System.out.print(su3[i]);
      		}
      
    • Arrays.copyOf()

      Arrays.copyOf(원본배열, 원본 배열에서 복사해올 길이)

      Arrays.copyOf(Object src, 원본 배열에서 복사해올 길이)
      
      int [] su = {1, 2, 3, 4, 5};
      		int [] su3 = Arrays.copyOf(su, su.length);
      		for(int i=0; i<su.length; i++) {
      			System.out.print(su3[i]);
      		}
      
    • Arrays.copyOfRange()

      Arrays.copyOfRange(배열original, 시작인덱스from, 복사할 길이to)

      int [] su = {1, 2, 3, 4, 5};
      		int [] su3 = Arrays.copyOfRange(su, 0, su.length);
      		for(int i=0; i<su.length; i++) {
      			System.out.print(su3[i]);
      		}
      

toString()

배열의 값만 for문을 사용하지 않고 쉽게 출력할 수 있다.

➡ java.util.Arrays.toString(배열);

System.out.println(Arrays.toString(su3));

image-20240611205933676image-20240611205947210

toString을 사용하지 않고 배열을 그냥 출력하면 데이터가 아니라 주소 값이 출력된다.

swap

int a = 10과 int b=20이 있는데, int a에 b의 값을 넣고 b에는 a의 값을 넣으려면 어떻게 해야할까?

int a = 10;
int b = 20;
int temp;

temp = a;
a = b;
b = temp;
System.out.println(a);
System.out.println(b);

image-20240611210748012

위와 같이 값을 잠시 다른곳에 담아두고 다시 넣어주면 된다.

배열의 연습문제 5번)

su 배열의 [0]번지와 [4]번지 데이터, [1]번지와 [3]번지 데이터 교환 후 출력!!

int [] su = {1, 2, 3, 4, 5};
int half = su.length/2; //교환하는 인덱스 수를 보면 가운데를 기준으로 교환이 두번 이루어짐
int temp;
for(int i=0,j=su.length-1; i<half; i++,j--){//i=0. j=4 > i=1, j=3
    temp = su[i];
    su[i] = su[j];
    su[j] = temp;
}
System.out.print(Arrays.toString(su));

입출력 4대 클래스

스트림(Stream) - 연속된 바이트의 흐름

읽기 쓰기  
InputStream OutputStream ⬅ 바이트 단위
Readr Writer ⬅문자단위

읽기 대표 메서드 : read()

쓰기 대표 메서드: write()

구분자

구분자로 입력받은 문자열을 나눌 수 있다.

  • split()

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String str = br.readLine(); //0 1 0 0 1입력
    // str="0 1 0 0 1"
    String [] strArr = str.split(" ");
    //strArr = {"0", "1", "0", "0", "1"}
    

    [문자열을 정수로 변환]

    int[]arr=new int[strArr.length]; //정수 데이터들을 담을 빈 배열 생성
    for(int i=0; i<strArr.length; i++){
        arr[i] = Integer.parseInt(strArr[i]);
    }//arr = {0, 1, 0, 0, 1};
    System.out.println(Arrays.toString(arr));
    => [0, 1, 0, 0, 1]
    
  • StringTokenizer

    StringTokenizer tokens = new StringTokenizer(나눌 문자열, 기준문자열str);

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String str = br.readLine(); //0 1 0 0 1입력
    // str="0 1 0 0 1"
    StringTokenizer tokens = new StringTokenizer(str, " ");
    //구분자를 통해 구분된 각각의 데이터를 '토큰'이라고 표현
    

    [문자열을 정수로 변환]

     int[]arr=new int[5]; //정수 데이터들을 담을 빈 배열 생성
     for(int i=0; i<5; i++){
     	arr[i] = Integer.parseInt(tokens.nextToken());
        System.out.println(Arrays.toString(arr));
     }//arr={0, 1, 0, 0, 1}
    System.out.println(Arrays.toString(arr));
    => [0, 1, 0, 0, 1]
    ==========================================================
     while(tokens.hasMoreTokens()) {
    			  System.out.print(tokens.nextToken());
    		  }
      
    

업데이트:

댓글남기기