자바에서는 배열의 인덱스 수를 미리 정해야 합니다.

배열의 수를 10개로 지정했는데 저장할 값은 하나라고 생각해보십시요.

그럼 나머지 9개의 인덱스는 놀고있죠.

나는 일하고있는데 옆에 사람들은 놀고있습니다.

음 뭔가 기분이 안좋습니다.

 

자바에서는 이런 놀고있는 사람(메모리)이 없도록 하기위해서

배열의 인덱스 수가 계속해서 변하도록 할 수 있도록 만든게 Collection Framework입니다.

 

Collection 직역하면 모임이라는 뜻입니다.

즉 데이터의 모임이라고 생각하시면 됩니다.

 

자바 모임은 여러 종류가 있는데 그 중 5가지 정도로 나타내 봤습니다.

  • List : 순서, 중복있는 데이터 모임
  • Set : 순서, 중복없는 데이터 모임
  • Map :  Key(순서, 중복없음), Value(순서없음, 중복있음) 조합의 데이터 모임
  • Queue : List 특징을 가지는데,  먼저 들어간 데이터가 나가는 모임 (First in First out)
  • Stack : List 특징을 가지는데, 먼저 들어간 데이터가 마지막에 나가는 모임 (Last in First out)

차이점을 알아 두면서 정리해야 나중에 쓰기 좋을 것 같습니다.

저는 Queue와 Stack의 차이점이 좀 햇갈렸는데,

비유해서 정리하자면,

출처: https://kadosholy.tistory.com/117

 

다이어그램을 하나 가져 와 봤습니다.

뭐가 되게 많습니다. 하나씩 알아 보도록 하죠.

 

더보기

ArrayList

- List 인터페이스 상속

- 순차적으로 데이터 저장

- 데이터 조회 속도가 빠름

- 중간중간 빈번한 데이터 추가 삭제 시 느림

- 멀티 스레드에서 사용시 위험

 

정리

위에서 중간에 위치한 데이터를 추가하거나 삭제할 때 느리다고 했는데

이게 무슨 말이냐면

1,2,3,4,5의 5개의 데이터가 있다고 생각합시다.

그중에서 2를 삭제합니다.

null 값이 2의 자리에 남는게 아니라

3,4,5가 앞으로 땡겨지면서

데이터가 저장됩니다.

그래서 추가를 하거나 삭제를 데이터 사이에 하면 속도가 느립니다.

 이런 추가 삭제를 빠르게 하고 싶다면 LinkedList를 사용하면 됩니다.

 

 

더보기

LinkedList

- List와 Deque 인터페이스 상속

- 양방향에서 데이터 검색 가능

- 중간 데이터 추가 삭제 시 주소값만 바꾸면 되기 때문에 속도가 ArrayList에 비해 빠름

- 각 요소를 노드라고 부름

- 조회 속도는 느림

 

정리

추가/삭제 속도를 빠르게 하려면 LinkedList

조회 속도를 빠르게 하려면 ArrayList

출처 : http://changpd.blogspot.com/2014/08/arraylist-linkedlist-java.html

위는 한 사이트에서 가져온 속도 테스트입니다.

그래프가 오른쪽으로 치솟을 수록 속도가 느립니다.

LinkedList의 추가/삭제 속도를 이해하기 위해 예를 들어보자면

1,2,3,4,5 에서 2를 삭제하면

1번 노드에서 다음 노드로 3번 노드를 가리키기만 하면 됩니다.

Deque에 대해서도 궁금할 수 있을 것 같은데

이해한대로 라면 LinkedList를 양방향으로 돌아다닐수 있게 하는것 같습니다.

궁금하시다면 제가 본 참고 사이트에 들어가서 한번 보십시요.

 

더보기

Vector

이건 요즘 안쓰니까 넘어갑시다.

라고 하면 안되겠죠

그런데 ArrayList랑 거의 똑같은데 동기화에서 차이가 있습니다.

ArrayList는 동기화가 안되고, Vector는 동기화가 됩니다.

동기화가 뭐냐면

쉽게 말해 한번에 하나의 스레드만 코드에 접근이 가능하다는 것입니다.

음 예로 들어보자면

스레드라는 화가가 그림을 그리고 있습니다.

근데 스레드2라는 다른 화가가 중간에 그림을 가로채서 그립니다.

이러면 당연히 그림이 제대로 완성이 되지 않겠죠

이걸 동기화가 안됐다고 합니다.

동기화가 안되면 여러 개발자들이 실행을 시켰을 때 문제가 생길 수 밖에없죠

 

그래서 처음에 Vector는 이런 문제를 미연에 방지할 수 있습니다.

그럼 ArrayList 말고 Vector 쓰면 되는거 아니냐구요?

Vector는 ArrayList에 비해 더 느립니다.

그리고 ArrayList도 이런걸 미연에 방지할 수 있습니다.

바로 Syncronize(동기화)를 명시해주면 됩니다.

이렇게 하면 더 빠르게 동적 배열을 사용할 뿐 아니라,

동기화도 할 수 있어 굳이 Vector를 사용하라는 상사의 명령이 아니라면

ArrayList 씁시다.

 

 

참고

동기화가 잘 구현되어 있어 멀티 스레드에서 문제 없이 사용이 가능하다면

코드가 Thread-safe하다 라고 합니다.

 


 

정리

Collection Framework는 자바 SE 6 중간 부터 사용가능

ArrayList를 대부분 활용하지만 LinkedList도 추가/삭제에 관한 부분에선 사용할 가능성이 있음

 

본 저자는 프로그래밍을 깊게 공부하지 않아 틀린점이 있을 수 있습니다.

그래서 반박 시 여러분 말이 맞습니다.

 

 

참고

https://gangnam-americano.tistory.com/41

https://kadosholy.tistory.com/117

https://choicode.tistory.com/25 
https://pridiot.tistory.com/68 (Deque 마지막 줄쯤에 있습니다)

https://yeolco.tistory.com/94 (ArrayList와 Vector)

https://m.blog.naver.com/goottjob/223134926879 (Thread)

'Java' 카테고리의 다른 글

[Java] Generic 정리  (2) 2024.01.05
[Java]클래스 정리 및 OOP 4가지 특징  (2) 2024.01.04
[Java] 자바 배열 선언  (0) 2024.01.01

프로그래밍 코드의 이름들은 대부분 직역하면 뭔지 알기 쉽습니다.

Generic(제네릭)

직역하면 일반적인이라는 뜻이죠,

일반적인라는건 뭘까요.

스키장 같은데 가면 뭘 입을까요?

"일반적으로" 사람들 모두 따뜻한 옷을 입고 고글을 끼고 안전장비를 착용합니다.

 

이렇듯 공통적인걸 모아놓은걸 일반적이라고 합니다.

그럼 프로그래밍에서 뭘 일반적으로 만들려고 generic을 사용할까요?

바로 데이터 타입입니다.

 

제네릭을 찾아보고있으시면 데이터 타입이 뭔지 알고 계시죠?

자바에서는 이런 데이터 타입에 특히 민감한데,

객체의 다형성을 위해서 이런 Generic을 고안해낸거 아닐까 싶습니다.(뇌피셜)

 

아무튼 제네릭은 객체나 메소드의 데이터타입을 코드 작성 단계에서 미리 특정하기 위해서 사용합니다.

이전 포스트에서 알아봤듯이 다형성이 주는 이점을 제네릭도 똑같이 가지고있습니다.

즉, 코드를 여러번 쓸 필요 없어진다는 거죠.

 

미리 한번 보여드리겠습니다.

//Main.java
public class Main {
    public static void main(String[] args) {

        //AnimalList 선언 <>이부분에 데이터 타입을 적음
        AnimalList<LandAnimal> landAnimal = new AnimalList<>(); // new 뒤 데이터 타입 Java SE 7부터 생략가능함.

        //List에 여러 타입의 객체 넣기 (다형성)
        landAnimal.add(new LandAnimal());
        landAnimal.add(new Cat());
        landAnimal.add(new Dog());
        // landAnimal.add(new Sparrow()); // LandAnimal을 상속받지 않았기 때문에 오류가 발생함.

        //하나씩 출력
        for (int i = 0; i < landAnimal.size() ; i++) {
            landAnimal.get(i).crying();
        }
    }
}
//상위 클래스인 LandAnimal 정의
public class LandAnimal {
    public void crying() { System.out.println("육지동물");
    }
}
import java.util.ArrayList;

//AnimalList 정의
public class AnimalList<T> {

    //ArrayList선언
    ArrayList<T> al = new ArrayList<T>();

    //add함수
    void add(T animal) { al.add(animal); }

    //T 제너릭 타입 반환
    T get(int index) { return al.get(index); }

    //배열 내 animal 삭제
    boolean remove(T animal) { return al.remove(animal); }

    //배열 크기
    int size() { return al.size(); }

}
//LandAnimal 상속 및 Cat클래스 정의
public class Cat extends LandAnimal{
    @Override
    public void crying() {
        System.out.println("야옹야옹");
    }
}
//LandAnimal 상속 및 Dog클래스 정의
public class Dog extends LandAnimal{
    @Override
    public void crying() {
        System.out.println("멍 멍");
    }
}
//육지동물이 아닌 Sparrow 클래스 정의
public class Sparrow {
    public void crying() {
        System.out.println("짹짹");
    }
}

 

보시면 <>안에 데이터타입을 적용하는걸 보실 수 있습니다.

이때 T라는 데이터타입을 정의하죠 이게 바로 Generic타입 입니다.

Generic은 여러가지 종류가 있는데

표를 한번 보시죠

출처 :&nbsp; https://st-lab.tistory.com/153

 

 

 

전 이 정도만 알고있을까 합니다.

사실 Collection 공부하다가 제너릭 뭘까 하다가 적어봅니다.

그런데 더 적었다간 배보다 배꼽이 커질 것 같습니다.

참고로 <>안에 적는 타입은 Wrapper로 기존 타입을 객체화 해서 적어야합니다.

자세하게 알고싶으시다면 https://dev-coco.tistory.com/9 이쪽으로 들어가십시요.

추가 정보가 필요하거나 자세하게 알고 싶으신 분들은 아래 참고 자료에 들어가서 보세요.

보다 디테일하게 정리되어있습니다.

 

 

참고

https://st-lab.tistory.com/153

https://www.tcpschool.com/java/java_generic_concept

 

 

 

 

 

'Java' 카테고리의 다른 글

[Java] 컬렉션(Collection) 정리 #1 List  (2) 2024.01.11
[Java]클래스 정리 및 OOP 4가지 특징  (2) 2024.01.04
[Java] 자바 배열 선언  (0) 2024.01.01

자바에서 클래스의 선언방법은 간단합니다.

[클래스이름] 변수 = new [클래스이름]();

 

Car.java

//Car 클래스 정의
public class Car implements Vehicle{
    //캡슐화 하기
    private String model;
    private String color;

    //밖에서 사용할 수 있는 set 함수
    public Car(String model, String color) {
        this.model = model;
        this.color = color;
    }

    //차의 기능은 캡슐화로 안보이게하기 기능: 시동, 앞으로가기, 뒤로가기
    private void startEngine() {
        System.out.println("시동을 겁니다.");
    }
    private void moveForward() {
        System.out.println("전진을 합니다.");
    }

    private void moveBackward() {
        System.out.println("후진을 합니다.");
    }

    //다른 함수에서 부를경우 operate 함수를 이용해서 기능이용
    @Override
    public void operate() {
        startEngine();
        moveForward();
        moveBackward();
    }

}

 

 

Driver.java

//Driver.java
public class Driver {
	//변수 private처리
    private String name;
    private Vehicle vehicle;

	//클래스 변수 초기화
    public Driver(String name, Vehicle vehicle) {
        this.name = name;
        this.vehicle = vehicle;
    }

    //클래스 변수 이름을 밖에서 볼수있도록 get처리
    public String getName() {
        return name;
    }

	//drive메소드사용
    public void drive() {
        vehicle.operate();
    }
}

 

Main.java에서 Car클래스 선언하기

//Main.java
public class Main {
    public static void main(String[] args) {
    	//Car클래스 선언
        Car car = new Car("테슬라 모델x", "레드");
        //Driver클래스 선언
        Driver driver = new Driver("운전자", car);
        
        driver.drive();
    }
}

 

클래스 선언 같은 경우 바로 변수를 초기화함으로써 편리하게 사용할 수 있도록 했습니다.

이렇게 클래스안의 변수를 초기화해 뒀다면,

새로운 Car함수로 파라미터를 없게 해 두면 파라미터 없이 클래스선언을 할 수 있습니다.

public Car() {}

이런 식으로 Car를 해두면 파라미터 없이 선언이 가능합니다.

선언하는 방법은 알았으니

위에 써져 있는 interface, 캡슐화 이런 거에 대해 알아보겠습니다..

 

참고로 이 블로그에서 공부를 하려고 한다면 별로 도움이 되지 않을 것입니다. 아래에 제가 본 블로그를 올려두었으니 거기서 공부하시면 편하실 것입니다.

 

일단 자바 객체에는 4가지 알아둬야 할 특징이 있는데

바로 추상화, 상속, 다형성, 캡슐화입니다.

 

첫 번째로 추상화를 정리하겠습니다.

제가 이해한 바를 정리하자면 추상화는 클래스에서 만들 메서드(함수)의 틀을 미리 정의해 두는 걸 말합니다.

interface, 추상 클래스가 이에 속합니다.

public interface Vehicle {
    void operate();
}

 

interface안에는 아무 기능 없이 메서드를 적어놓습니다. 그리고 implements를 클래스에 적용시켜서 operate 메소드를 사용하도록 강요합니다. 이런식으로 미리 메소드를 설계하고 class 내부에서 기능을 작성하는 것으로 좀 더 효율적인 개발을 할 수 있다고 합니다.

 

두 번째로 상속이란 상위 클래스에서 정의된 변수나 메서드를 하위 클래스에서 사용할 수 있게 하는 겁니다. 상위니 하위니 처음 공부할 때는 좀 상상이 안 갑니다. 

쉽게 이해하자면 클래스 하나 다 썼는데 다른 데서도 똑같은 메서드를 쓰는 겁니다. 그때 상속을 이용하면 편합니다.

//Car 클래스 정의
public class Car implements Vehicle{
    //캡슐화 하기
    private String model;
    private String color;


    public Car() {}

    //밖에서 사용할 수 있는 셋 함수
    public Car(String model, String color) {
        this.model = model;
        this.color = color;
    }

    //차의 기능은 캡슐화로 안보이게하기 기능: 시동, 앞으로가기, 뒤로가기
    private void startEngine() {
        System.out.println("시동을 겁니다.");
    }
    private void moveForward() {
        System.out.println("전진을 합니다.");
    }

    private void moveBackward() {
        System.out.println("후진을 합니다.");
    }

    //다른 함수에서 부를경우 operate 함수를 이용해서 기능이용
    @Override
    public void operate() {
        startEngine();
        moveForward();
        moveBackward();
    }
    public void scenario() {
        moveForward();
        moveBackward();
        moveForward();
        moveBackward();
    }

}
//MotorBike클래스 정의
public class MotorBike extends Car implements Vehicle{

	//변수 private처리
    private String model;
    private String color;

	//set 함수
    public MotorBike(String model, String color) {
        this.model = model;
        this.color = color;
    }

	//고유의 기능 stunt
    private void stunt() {
        System.out.printf("%s %s인 오토바이가 묘기를 부립니다.\n",model,color);
    }
    
    //Overide로 새로운 기능 정의
    @Override
    public void operate() {
        stunt();
        scenario();
    }
}

@Override는 굳이 안 써도 됩니다. 저건 어디 다른데 있는 함수와 이름이 같은데 다른 기능으로 쓸 겁니다 라는 표시입니다.

아무튼 보시면 Car.java에 새로운 함수인 scenario를 만들었습니다.

그리고 extends Car를 MotorBike뒤에 적었습니다. 바로 상속입니다.

 

상속은 다음과 같이 extends를 이용해서 사용할 수 있습니다.

뭐가 달라진 건가요?

보시면 operate함수 안에 scenario라는 함수가 있죠?

근데 scenario라는 함수가 MotorBike클래스 안에 없습니다.

 

그럼에도 코드는 잘 실행됩니다. 바로 Car 클래스 안에 scenario가 있기 때문이죠

근데 Car클래스에서는 stunt함수를 사용할 수 없습니다. private로 만든 이유도 있겠지만 public으로 바꿔도 사용 못합니다.

또 Car클래스에서 private로 처리해 둔 변수나 함수는 MotorBike에서 사용할 수 없습니다.

 

상속 같은 경우에는 비유를 하자면

멤버십을 가입하는 겁니다.

 

자 저희가 멤버십을 제공하는 업체와 멤버십을 이용하는 고객이 있다고 합시다.

멤버십 제공하는 업체는 일반 고객보다 멤버 고객에게 더 많은 걸 제공하죠?

그래서 원래는 돈 내고 쓰는 걸 멤버 고객은 공짜로 쓸 수 있습니다.

그런데 맴버 고객한테 모든 걸 다 줄 수는 없기도 하고 멤버 고객한테 돈 이외에 업체가 뭘 요구하진 않습니다.

 

이걸 자바로 풀어내면

상위 클래스 - 멤버십 제공업체

하위 클래스 - 멤버 고객

아무 클래스 - 일반 고객

돈 - new 객체 선언

 

이 정도 일 것 같습니다.

 

다형성도 위의 예제에서 찾아볼 수 있습니다. 다형성 같은 경우 하나의 상위 객체로 여러 하위 객체들을 사용할 때 볼 수 있습니다. 예를 들면 위의 Vehicle 함수에서 operate기능이 있죠.

//Driver 클래스 정의
public class Driver {
	//캡슐화
    private String name;
    private Vehicle vehicle;

	//캡슐화를 위한 set, get함수
    public Driver(String name, Vehicle vehicle) {
        this.name = name;
        this.vehicle = vehicle;
    }

    public String getName() {
        return name;
    }
    

	//고유의 drive함수
    public void drive() {
        vehicle.operate();
    }
}

 

위 코드를 보시면 set함수에 Vehicle vehicle 파라미터가 보이십니까?

Vehicle은 인터페이스인대 이게 뭐지 싶습니다.

Vehicle인터페이스를 제공하는 class에는 Car 클래스와 MotorBike클래스가 있습니다.

public class Main {

    public static void main(String[] args) {
        Car car = new Car("테슬라 모델x", "레드");
        MotorBike motorBike = new MotorBike("바이크 모델", "블루");
        Driver driver = new Driver("운전자", car);
        Driver driver2 = new Driver("운전자2", motorBike);

        driver.drive();
        driver2.drive();
    }
}

 

Main.java에 보시면 운전자가 두 명 있습니다. 근데 두 번째 파라미터로 받는 객체가 각각 다르죠

그런데 코드는 정상적으로 실행됩니다. 이걸 바로 다형성이라고 합니다.

이런 식으로 코드를 짜면 반복되는 코드를 줄일 수 있다고 합니다.

다형성이 없는 코드는 참고사이트에서 "Vehicle 인터페이스 적용"을 Ctrl + F 눌러서 찾아보세요.

 

마지막으로 캡슐화입니다. 위 코드에서 interface의 메서드는 하나뿐인 거 보이십니까?

원래는 startEngine, moveBackward, moveForward도 저 안에 있었습니다.

 

근데 캡슐화 챕터 가서 private 걸려고 하니까 자꾸 에러가 뜨더라고요.

그래서 좀 찾아봤더니 interface와 상속할 변수들은 public으로 특정해야 한다고 합니다.

즉 interface에 쓰는 메서드는 모두 public으로 설계해야 한다는 것이죠

 

private, public, protected 이걸로 변수가 공유될 범위를 특정할 수 있는데

이미지를 좀 찾아보니

이런 게 있었습니다. default는 아무것도 안 쓴 경우입니다.

자 보시면 아까 제가 멤버십 비유를 했습니다.

그 비유를 여기서도 적용시킬 수 있는데

protect부터 멤버 고객에게 제공할 수 있습니다.

그리고 default는 사내에 다른 팀원들에게 까지 공유되고

private부터는 우리 팀만 볼 수 있는 겁니다.

전 이런 식으로 이해하니까 상상이 돼서 쉽더라고요.

자기는 더 좋은 방식이 있다 하시면 그 방식으로 알아두시면 됩니다.

 

그래서 캡슐화는 제가 이해하기에 private, protected를 어디까지 하냐 그리고 set, get함수를 사용하는 것이다.

위에 코드로 보시면 편할 테니 아래에 한 번도 복붙 해두겠습니다.

//Car 클래스 정의
public class Car implements Vehicle{
    //캡슐화 하기
    private String model;
    private String color;


    public Car() {}

    //밖에서 사용할 수 있는 셋 함수
    public Car(String model, String color) {
        this.model = model;
        this.color = color;
    }

    //차의 기능은 캡슐화로 안보이게하기 기능: 시동, 앞으로가기, 뒤로가기
    private void startEngine() {
        System.out.println("시동을 겁니다.");
    }
    private void moveForward() {
        System.out.println("전진을 합니다.");
    }

    private void moveBackward() {
        System.out.println("후진을 합니다.");
    }

    //기능을 은닉해서 operate만 보이게함
    @Override
    public void operate() {
        startEngine();
        moveForward();
        moveBackward();
    }
    public void scenario() {
        moveForward();
        moveBackward();
        moveForward();
        moveBackward();
    }

}
//MotorBike클래스 정의
public class MotorBike extends Car implements Vehicle{

	//변수 private처리
    private String model;
    private String color;

	//set 함수
    public MotorBike(String model, String color) {
        this.model = model;
        this.color = color;
    }

	//고유의 기능 stunt
    private void stunt() {
        System.out.printf("%s %s인 오토바이가 묘기를 부립니다.\n",model,color);
    }
    
    //Overide로 새로운 기능 정의
    @Override
    public void operate() {
        stunt();
        scenario();
    }
}
//Driver 클래스 정의
public class Driver {
	//캡슐화
    private String name;
    private Vehicle vehicle;

	//캡슐화를 위한 set, get함수
    public Driver(String name, Vehicle vehicle) {
        this.name = name;
        this.vehicle = vehicle;
    }

    public String getName() {
        return name;
    }
    

	//고유의 drive함수
    public void drive() {
        vehicle.operate();
    }
}
public class Main {

    public static void main(String[] args) {
        Car car = new Car("테슬라 모델x", "레드");
        MotorBike motorBike = new MotorBike("바이크 모델", "블루");
        Driver driver = new Driver("운전자", car);
        Driver driver2 = new Driver("운전자2", motorBike);

        driver.drive();
        driver2.drive();
    }
}

 

출처:  https://www.codestates.com/blog/content/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8A%B9%EC%A7%95

 

오늘 OOP에서의 객체 4가지 특징을 정의해 봤습니다.

사실상 어려운 말들을 제가 알기 쉽게 적어놓은 거라 이해가 안 되는 부분도 있을 거라고 생각합니다.

여러분은 여러분의 방식대로 공부하시면 됩니다. 저는 이만 가보도록 하죠.

 

 

참고

https://www.codestates.com/blog/content/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8A%B9%EC%A7%95

 

https://kg-dlife.tistory.com/24

 

 

 

'Java' 카테고리의 다른 글

[Java] 컬렉션(Collection) 정리 #1 List  (2) 2024.01.11
[Java] Generic 정리  (2) 2024.01.05
[Java] 자바 배열 선언  (0) 2024.01.01

자바의 배열(array)

배열은 같은 타입의 데이터를 연속된 공간에 나열하고 각 인덱스(index)를 부여한 자료구조입니다.

음 쉽게 말해서 상자 안에 여러 데이터를 넣고 그걸 차례대로 쓰는 것이죠.

 

이미지 출처: https://hongong.hanbit.co.kr/java-%EC%9E%90%EB%B0%94-%EB%B0%B0%EC%97%B4array-%EC%84%A0%EC%96%B8%ED%95%98%EA%B3%A0-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0/

 

구글에서 찾아본 이미지로는 이런 이미지인데

위처럼 상자 안에 여러 데이터를 넣는 걸 말합니다.

 

조금 특별한 특징이라면 자바에서는 다른언어(python, JS)등에 비해 좀 더 엄격하게 타입을 관리하기 때문에

int, String, double 등의 타입을 항상 선언해야합니다.

 

이 부분은 안 읽으셔도 됩니다.

왜 그런가 좀 알아보니까, 엄격하게 타입을 관리할수록 안전하다고 합니다.

 

1가지 이유에대해 예를 들어보자면, JS에서는 이런 타입선언에 민감하지 않아서 변수 쓰고 아무 타입의 데이터를 저장할 수 있습니다. 그런데 이렇게 되면 유저가 뭘 찾아달라고 하면 한 배열 안에 여러 가지 타입의 변수들이 있어 찾기 어려워집니다. 그래서 요새는 타입을 관리하지 않는 언어에서도 TypeScript와 같은 라이브러리를 사용하는 게 필수라고 합니다.


더보기

배열을 선언하는 방법

배열을 선언하려면 [](대괄호)를 변수의 타입뒤나 이름뒤에 쓰실 수 있습니다.

타입[] 변수 혹은 타입 변수[]

이런식으로 말이죠

가장 많이 쓰는 건 타입[] 변수입니다.

지금 선언하는 건 1차원 배열 선언이고

또 다른 2차원 배열을 선언하는 것도 있어 자주 쓰인다고 합니다.

 

더보기

배열 초기화하기

배열을 초기화하는 방법:

타입[] 변수 = new 타입[길이]

여기서 헷갈릴 수 있는 부분이 길이를 설정하는 건데

 

예를 들면

int[] number = new int[3] 이런 식으로 길이를 설정하면

number[0]

number[1]

number[2]

까지 쓸 수 있습니다.

배열의 특징 중 하나입니다.

index는 0부터 시작하기 때문에 길이를 3으로 설정하면

0,1,2까지 3개까지 값을 넣을 수 있습니다.

 

더보기

배열에 값 넣기

위에서 한 것처럼 초기화한 뒤에

변수[인덱스] = 값

이런 식으로 값을 넣어줄 수 있습니다.

number[0] = 13

number[1] = 12

number[2] = 10

 

좀 번거롭지 않습니까?

 

그래서 다른 방법으로

int [] number = {13,12,10}

이런 식으로 초기화하면서 선언할 수 있습니다.

 

함수가 궁금하다면 따로 찾아보시고

근데 함수의 파라미터로 배열을 사용한다면 에러가 발생하는 경우가 있습니다.

예를 들어

public class Main {
    public static void main(String[] args) {
        System.out.println(add({10,20}));
        
        }
    public static int add(int[] numbers) {
        return numbers[0] + numbers[1];
    }
}

이런 경우가 있는데

이런 식으로 쓰면 컴파일 에러가 뜹니다.

이를 해결하려면

System.out.println(add(new int[]{10, 20}));

 

add 함수를 사용한 부분에서 new int []를 값들의 앞에 사용하면 됩니다.

근데 사실 저런 식으로 배열을 넣는 경우는 거의 없습니다.

 

더보기

배열 값 출력하기

그냥 변수[인덱스]로 출력할 수 있지만,

보통 for문을 배열과 함께 자주 사용하는데, 요. length 메서드 덕분인 것 같습니다.

array.length를 하면 배열의 인덱스 개수를 자동으로 새 줍니다.

이런 고마운 메서드는 기억해 둡시다,

public class Main {
    public static void main(String[] args) {
        int[] array = {10,12,11};

        for (int i = 0; i < array.length; i++) {
            System.out.printf("array[%d] = " + array[i] + "\n",i);
        }
    }
}

 

위에 입력한 것처럼 하면

array[0] = 10
array[1] = 12
array[2] = 11

이런 식으로 나옵니다.

 

Arrays.toString이란 메서드도 있는데 자주 사용하진 않는다.

궁금하면 찾아보면 됩니다.

 

 

더보기

핵심요약

배열 선언은

타입[] 변수 = {값 1, 값 2,...};

 

배열 출력은

for문을 이용해서 하면 편하다.

length메서드를 기억하자

index는 0부터 시작한다.

 

기초적인 요약은 이 정도입니다.

 

'Java' 카테고리의 다른 글

[Java] 컬렉션(Collection) 정리 #1 List  (2) 2024.01.11
[Java] Generic 정리  (2) 2024.01.05
[Java]클래스 정리 및 OOP 4가지 특징  (2) 2024.01.04

+ Recent posts