본문 바로가기
공부기록/Java

4월 11일 (1) Java - 배열, 리스트

by project100 2023. 4. 11.


배열 

1차원배열 - [1,2,3,5,6,...., n]

다차원 배열

2차원 배열 선언)

동일한 타입으로 만들어진다.

자료형 배열명[][] = new 자료형[줄개수][칸개수];

 

예) 

int [2][3] 

공간 구성

0.0 0.1 0.2
1.0 1.1 1.2

 

 

배열의 구조적 문제로 인해서 효율성이 떨어진다.

배열의 구조적 문제 (크기 변경이 불가)

-> ArrayList 객체를 활용

 

 

리스트(List) 구조 객체 - ArrayList

배열의 구조적 한계(크기 변경 불가 등)로 활용율이 떨어짐

대신 ArrayList를 주로 활용

 

ArrayList는 크기가 가변적이기 때문에 효율적이다.

 

ArrayList 

배열 형태의 목록 객체 -> 인스턴스 만들어서 사용해야 한다.

크기 변경이 자유로움

 

선언)

ArrayList <자료형> 목록명 = new ArrayList<자료형>(초기값 목록);

new 뒤에 나오는 자료형은 생략 가능하다.

자료형은 Wrapper Class로 작성

 

예) ArrayList <Integer> intArr = new ArrayList<>();

 

관련메소드 : ArrayList명.메소드():

1) 추가 : add(값); - 목록에 값을 추가

              add(순번, 값) - 순번 위치에 값 추가

2) 가져오기 : get(순번) - 목록의 순번 위치의 값 가져오기

3) 변경 : set(순번, 값) - 순번 위치의 값을 변경

4) 값 삭제 : remove(값|순번) - 값 또는 순번에 해당하는 목록의 값 삭제

5) 전체 삭제 : clear() - 모든 값 삭제

6) 크기 : size() - 목록 값의 개수

7) 위치검색 : indexOf(값) - 값의 순번을 반환

8) 존재 유무 확인 : contains(값) - 있으면 true, 없으면 false

 

 

 

 

지울 때 배열의 순번을 지정해 주거나, 데이터의 값을 찾은 후 지워야 오류가 나지 않는다.

현재 배열의 크기는 4

10이라는 순번이 없기 때문에 오류가 남.

import java.util.ArrayList;

public class ArrayListTestClass {
    public static void main(String[] args) {
        ArrayList<Integer> intArry = new ArrayList<>();

        //원소 추가 : add()
        intArry.add(10);
        intArry.add(20);
        intArry.add(30);
        intArry.add(1, 40); // 1번 자리에 40을 넣어라

        System.out.println(intArry); // [10, 40, 20, 30]
        System.out.println(intArry.size()); //4

        // 원소 하나씩 사용(반복출력)
        for(int i = 0; i < intArry.size(); i++){
            System.out.println(intArry.get(i));
        }

        // 원소 변경 : set
        intArry.set(2, 50);
        System.out.println(intArry); // [10, 40, 50, 30]

        // 원소 찾기 : indexOf(), contains()
        System.out.println(intArry.indexOf(50)); // 있을 경우 위치 표시, 없을 경우 -1,
        System.out.println(intArry.contains(60)); // 해당 데이터가 있다 없다

        // remove
        // intArry.remove(new Integer(10));
//        intArry.remove(1); // 배열 번호로 삭제
//        System.out.println(intArry);
//
//        // 정수 객체 생성
//        Integer iv = new Integer(10);
//        // 실수 객체 생성
//        Float fv = new Float(1.5);
//
//        // 전체삭제
//        intArry.clear();
//        System.out.println(intArry);
//        System.out.println(intArry.size());

//        int idx = intArry.indexOf(40); // 위치 검색 [10, 40, 50, 30]
//        // 데이터가 있다면 지워라
//        if(idx != -1){
//            intArry.remove(idx); // 원소 삭제
//            System.out.println(intArry); // [10, 50, 30]
//        }


        int idx = intArry.indexOf(70); // 위치 찾기
        // 데이터가 있다면 지워라
        if(idx != -1){
            intArry.remove(idx); // 원소 삭제
        } else {
            System.out.println("찾는 원소 없음");
        }

        // 문자열 ArrayList
        ArrayList<String> strArr = new ArrayList<>();
        strArr.add("사과");
        strArr.add("배");
        strArr.add("복숭아");

        System.out.println(strArr);
        // forEach문 배열을 순차적으로 나타내기 변하다. 읽기전용
        for(String s : strArr){
            System.out.println(s);
        }

    }
}

 

 

메소드(Method)

한 가지 목적을 처리하기 위한 명령어 묶음(함수)

객체 내에 위치하는 함수를 메소드라고 한다.

 

파라미터 - 인자, 인수, 메소드에 전달되는 값

다른 곳에 있는 파라미터를 사용할 경우 메시지라고도 한다.

클래스 => 공간

 

4가지 유형) 자바스크립트 함수 유형과 동일

1. 파라미터(parameter), 반환값(return) 모두 사용

2. 반환값만 사용

3. 파라미터만 사용

4. 파라미터, 반환값 모두 사용하지 않음

 

자바스크립트는 자료타입이 존재하지 않는다. function이라고 작성

자바는 타입이 있기 때문에 type먼저 작성

 

문법)

자료형 메소드명(파라미터목록){ -> 선언부(Head)

            명령문장;                         -> 정의부(Body)

             [return] [결과값]

} // 범위지정형태

 

메소드 선언 시 사용하는 자료형은? 반환형 Return type

즉, 결과값(반환값)의 자료형.

 

반환값이 없을 때 반환형에 사용하는 키워드 : void

 

static : 정적(반대말 dynamic, 동적)

자바에서 스태틱은 인스턴스 없이 쓸 수 있다는 의미

자바는 객체지향 언어기 때문에 모든 코드는 인스턴스화되어야 사용 가능하다.

 

프로그램 실행은 main을 포한하는 클래스(MainClass)도 인스턴스로 만들어져야 한다는 말임.

MainClass는 누가 인스턴스로 만드는가? 치킨게임 닭이 먼저냐? 달걀이 먼저냐? 외부에서 만들어짐 머신?

static은 아무것도 없는 세상에 닭을 만드는 방법을 제공한다.

인스턴스가 없기 때문에 인스턴스 없이도 실행 가능하도록 static이 붙는다.

 

 

메소드 구분

1) 스태틱 메소드 : static 키워드가 붙은 메소드(main) 인스턴스가 없이 호출(사용) 가능

2) 인스턴스 메소드 : 인스턴스가 생성되어야(new 사용) 존재하는 메소드, static 키워드가 안 붙은 메소드, main이후에 작성되는 메소드

 

public class StaticTestClass {

public static void main(String[] args) {
int r = addNum(10, 20); 인스턴스가 없기 때문에 사용불가
int addNum(int a, int b){
int res = a + b;
return res; // 타입을 썼는데 생략 시
        } // method end
} // class end

 

public class StaticTestClass {
    // main 메소드 (부장)
    public static void main(String[] args) {
        // 프로그램 인스턴스가 없이도 시작을 해야하기 때문에 main에는 static이 붙는다.
        // 메소드의 호출은 반드시 메소드 안에서 해야 한다.
        int r = addNum(10, 20);
        
        // 두번째 방법 클래스 자신의 인스턴스를 스스로 생성
        StaticTestClass stc = new StaticTestClass();
        int r2 = stc.subNum();
    }
    // 메소드 (대리) - 두 수를 더해주는 메소드
    // 첫번째 방법 static을 붙인다.
    static int addNum(int a, int b){
        int res = a + b;
        return res; // 타입을 썼는데 생략 시 오류
    } // method end
    
    int subNum(){
        int a, b;
        a = 30;
        b = 10;
        return a - b;
    }
} // class end