728x90

[컬렉션 프레임워크]

  • 컬렉션 프레임 워크에는 List / set / map등의 인터페이스를 제공한다.
  • 많은 데이터를 쉽고 편리하고 효과적으로 관리하기 위에 자바에서 제공하는 클래스의 모음이다.

[ArrayList]

  • List 인터페이스에서 상속 받아 사용된다.
  • ArrayList는 객체가 추가 되면서 용량이 초과 되면 초과된 용량 만큼 길이가 늘어나게 된다.

(예시) 여러 명이 앉을 수 있는 의자에서 중간에 사람이 앉으려 하면 그 위치부터 모든 사람이 한칸씩 이동해주어야한다.

 

[ArrayList 선언 방법]

 public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList<>(); 
 }
  • <> 안에는 Integer, String, Character, Student, Phone 등과 같은 다양한 타입이 들어 올 수 있다.  

[ArrayList 데이터 추가]

 public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList<>(); 
    
    // 데이터 추가
    list.add(1);
    list.add(2);
 }
  • add(Object)를 사용하여 인덱스 마지막에 데이터를 추가한다.
  • add(Object, index)를 사용하여 지정한 인덱스에 값을 추가할 수 있다. 

 

[ArrayList 데이터 조회]

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

    // 데이터 추가
    list.add(1);
    list.add(2);

    // 데이터 조회
    System.out.println(list.get(0));
    System.out.println(list.get(1));
 }
  • get(index)를 사용하여 해당 인덱스의 데이터를 조회할 수 있다. 
  • 반복문을 사용하여 해당 인덱스 혹은 전체 데이터를 조회할 수 있다.   

 

[ArrayList 데이터 삭제]

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

    // 데이터 추가
    list.add(1);
    list.add(2);

    // 데이터 삭제
    list.remove(1);
    list.clear();
 }
  • remove(Object)를 사용하여 Object와 같은 값을 삭제한다.
  • clear()를 사용하여 값 전체를 삭제할 수 있다.  

 

[ArrayList 데이터 변경]

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

    // 데이터 추가
    list.add(1);
    list.add(2);

    // 데이터 변경
    list.set(0, 3);
    list.set(1, 5);
 }
  • set(index, Object)를 사용하여 값을 변경할 수 있다. 
  • 데이터를 변경하려면 해당 데이터의 인덱스를 알아야 한다. 

 

[ArrayList 데이터 검색하기]

 public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>(); 

    // 데이터 추가
    list.add("자바");
    list.add("파이썬");

    // 데이터 검색
    if(list.contains("자바")){
        System.out.println("글자 검색하기");
    }
 }
  • contains(Object)를 사용하여 원하는 데이터를 검색할 수 있다. 

 

[ArrayList크기 구하기]

 public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();

    // 데이터 추가
    list.add("자바");
    list.add("파이썬");

    // 크기 구하기
    System.out.println(list.size();
 }
  • list.size()를 사용하여 해당 리스트의 크기를 구할 수 있다.
728x90
728x90

[제네릭이란?]

- 다양한 타입의 객체를 지원하는클래스, 인터페이스 또는 메소드를 정의하는 방법

- 같은 동작을 하는 클래스나 메소드를 계속 구현할 필요 없이 한번 정의하면 여러 타입에서 사용가능 하다.

- 제네릭은 다양한 타입의 '객체'를 지원한다고 하였다. 즉, 기본 자료형은 제네릭 타입으로 사용 불가능하다.

- 기본 자료형을 사용하려면 Wrapper 클래스를 사용하면 된다.    

 

[제네릭의 장점]

1. 제네릭을 사용하면 잘못된 타입이 들어 오는 것을 컴파일 단계에서 방지할 수 있다.

2. 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해 줄 필요가 없다. 즉, 관리가 편리함.

3. 비슷한 코드를 구현할 경우 여러 타입에서 사용가능하기 때문에 재사용성이 높다.

 

[코드]

public static void main(String[] args){

Integer intArray = {1, 2, 3, 4, 5};
String stringArray = {"가", "나", "다"};

arr(intArray);
arr(stringArray);

}

private static <T> void arr(T[] arr){
    for(T type : arr){
        System.out.println(t);
    }
}
  • 위의 코드처럼 <T : Type, K : Key, V : Value, E : Element 등등 > 안에 타입을 지정해주면 된다. 
  • ArrayList<String>, List<T> 등등 이런 것들도 제네릭이다.  

[제네릭 클래스]

- 제네릭 클래스도 위에 설명한 제네릭과 같다.

 

아래 코드로 살펴보면 

 

[코드]

public static void main(String[] args) {
	
    FixPhone<String> fix = new FixPhone<>("홍길동");
    fix.come();
    
    FixPhone<Integer> fix2 = new FixPhone(1);
    fix.com();

}

public class FixPhone <T>{
    public T name; // 손님 이름

    public fixPhone(T name){
        this.name = name;
    }

    public void come(){
        System.out.println(name + " 고객님 차례가 되었습니다.);
    }
}

- 클래스 명 뒤에 <>로 타입을 지정하여 사용할 수 있다.

 

[Wrapper 클래스]

Wrapper 클래스는 기본 자료형을 객체 형태로 만들어 사용할 수 있도록 해주는 것이다.

기본자료형 Wrapper 클래스
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
void Void

 

728x90

'Java' 카테고리의 다른 글

[Collection 프레임워크] - LinkedList  (0) 2023.06.12
[Collection 프레임워크] - ArrayList  (0) 2023.06.12
인터페이스 - 놀이공원 티켓 구입하기  (0) 2023.06.08
인터페이스  (0) 2023.06.08
추상클래스  (0) 2023.06.08
728x90

[문제 설명]

정수 리스트 num_list와 정수 n이 주어질 때, num_list의 첫 번째 원소부터 마지막 원소까지 n개 간격으로 저장되어있는 원소들을 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

 

[입출력 예]

num_list n result
[4, 2, 6, 1, 7, 6] 2 [4, 6, 7]
[4, 2, 6, 1, 7, 6] 4 [4, 7]

 

[차근 차근 생각해보기]

  • 이름이 arr인 ArrayList를 만든다.
  • num_list의 길이 만큼 돌면서 i가 n의 배수이면 arr에 num_list의 i번째를 넣어준다.
  • arr의 사이즈만큼의 answer 배열을 만들어 준 후
  • arr의 size만큼 돌면서 answer배열에 arr의 i번째 요소를 Integer에서 int로 바꾸어 넣어준다.
  • answer를 리턴 해준다.

 

[결과]

<수정 전>

class Solution {
    public int[] solution(int[] num_list, int n) {
       int[] answer = new int[num_list.length/n];

        for(int i = 0; i < num_list.length; i++){
                if(i%n == 0){
                    answer[i/n] = num_list[i];
                }
        }

        return answer;
    }
}

 

<수정 후>

import java.util.ArrayList;
class Solution {
    public int[] solution(int[] num_list, int n) {

        ArrayList<Integer> arr = new ArrayList<>();

        for(int i = 0; i < num_list.length; i++){
                if(i%n == 0){
                    arr.add(num_list[i]);
                }
        }
        int[] answer = new int[arr.size()];

        for(int i = 0; i < arr.size(); i++){
            answer[i] = arr.get(i).intValue();
        }

        return answer;
    }
}

 

[반성할 점]

<수정 전>

 answer 배열을 num_list를 n으로 나눈 길이 만큼 선언 해주었다.

n개 간격이면 n의 배수가 되어야 하기 때문에 'i가 n의 배수이면' 이라는 조건문을 넣어주었다.

answer의 i번째에 num_list의 i번째를 넣어주려 했으나

이렇게 되면 answer의 i번째에 0,1,2,3 이런 순서가 아닌 n의 배수가 들어가게 되어 오류가 났다.

 

 생각해보니 n이 2이라면 num_list의 0, 2, 4, 6 순서로 들어갈 것이고, 

num_list[0] => answer[0] / num_list[2] => answer[1] / num_list[4] => answer[2]의 방식으로 들어가야했다.

그래서 answer[i / n]를 해주면 위와 같은 방식으로 값이 들어갈 수 있었다.

 

<수정 후>

하지만 위의 방식은 n의 2일 경우였다. 예제인 n이 4일 경우엔 answer 배열의 길이를 num_list의 n으로 나누게 된다면

6 / 4 = 1이 되어 answer 배열의 길이는 1이 되어 오류가 났다.

 

그래서 answer 배열의 길이를 신경 쓰지 않고 하기 위해 ArrayList로 만들어 ArrayList에 'i가 n의 배수이면' num_list의 i번째를 넣어 주었고 배열로 바로 변환하여 return을 해주려 했다. 생각해보니 ArrayList는 Wrapper 클래스를 사용하고 있어 arr인 ArrayList를 반복문으로 돌면서 intValue()라는 메소드를 사용 하여 Integer 객체에서 int형 값을 뽑아주는 메소드를 사용하였다.

 

ArrayList를 사용하는 것은 내 생각이 아닌 친구의 제안이었다..ㅠㅠ 아직 저런 사고까지 하는 것은 힘든 것 같다..

그래도 ArrayList라는 힌트를 얻어 나머지는 검색하면서 잘 해결해냈다..!! 이런 저런 케이스를 경험하는 것이라고 생각하고 문제를 많이 많이 풀어보고 내 것으로 만들어야겠다.

 

728x90
728x90

[문제 설명]

문자열 my_string과 정수 n이 매개변수로 주어질 때, my_string의 뒤의 n글자로 이루어진 문자열을 return 하는 solution 함수를 작성해 주세요.

 

[입출력 예]

my_string n result
"ProgrammerS123" 11 "grammerS123"
"He110W0r1d" 5 "W0r1d"

 

[차근 차근 생각해보기]

  • my_string 문자열 뒤에서 n번째부터 my_string의 마지막까지 잘라주고
  • answer에 넣어준 뒤 reutrn 해주기

 

[결과]

class Solution {
    public String solution(String my_string, int n) {
        String answer = my_string.substring(my_string.length()-n, my_string.length());
        return answer;
    }
}

 

[반성할 점]

  • 뒤의 n번째부터 마지막까지 자른 다는 생각을 하지 못했다.
  • java에서 문자열 자르는 방법을 검색해보고 난 후 저런 방법이 있다는 것을 보았다.
  • 아직 조금 더 차근차근 생각하는 것이 많이 부족한 것 같다.
  • 조급해하지 말고 차근 차근 생각하기..!
728x90
728x90

[문제 설명]

정수 리스트 num_list와 정수 n이 주어질 때, num_list의 첫 번째 원소부터 n 번째 원소까지의 모든 원소를 담은 리스트를 return하도록 solution 함수를 완성해주세요.

 

[입출력 예]

num_list n result
[2, 1, 6] 1 [2]
[5, 2, 1, 7, 5] 3 [5, 2, 1]

 

[차근 차근 생각해보기]

  1. answer의 배열의 길이를 n까지로 정해준다.
  2. n의 길이까지 돌면서
  3. answer 배열에 num_list의 i번째 요소를 넣어준다.

 

[결과]

<수정 전>

class Solution {
    public int[] solution(int[] num_list, int n) {
        int[] answer = new int[n];
        for(int i = 0; i < num_list.length; i++){
            if(i < n){
                answer[i] = num_list[i];
            }
        }
        return answer;
    }
}

 

<수정 후>

class Solution {
    public int[] solution(int[] num_list, int n) {
        int[] answer = new int[n]; 
        for(int i = 0; i < n; i++){
            answer[i] = num_list[i];
        }
        return answer;
    }
}

 

[반성할 점]

<수정 전>

  • answer 배열을 n만큼 정해주어야 n의 길이 만큼 배열에 요소가 담길 것이라고 생각하지 못했다.
  • i가 n보다 작은 것은 배열의 인덱스는 0부터 시작하니까 i가 n보다 작아야 한다.
  • i번째 요소를 answer의 i번째에 담아주면 n번째 원소까지 값이 들어갈 것이다.

<수정 후>

  • 수정 전 코드는 불필요한 코드가 있었다.
  • num_list의 첫번째 원소부터 n번째 원소까지 넣는 것이기 때문에
  • n번째까지 돌면서 num_list의 i번째를 answer의 i번째에 넣어주고
  • answer를 리턴해주면 되는 것인데 굳이 조건문을 사용하여 불필요한 코드를 작성했었다.
  • 조건을 잘 생각하며 차근 차근 풀기..!
728x90
728x90

[문제 설명]

정수 리스트 num_list와 찾으려는 정수 n이 주어질 때, num_list안에 n이 있으면 1을 없으면 0을 return하도록 solution 함수를 완성해주세요.

 

[입출력 예]

num_list n result
[1, 2, 3, 4, 5] 3 1
[15, 98, 23, 2, 15] 20 0

 

[차근 차근 생각해보기]

  1. num_list의 길이까지 돌면서
  2. num_list의 i번째 요소가 n과 같으면 1을 리턴해주고
  3. 그게 아니면 0을 리턴해준다.
  4.  

[결과]

class Solution {
    public int solution(int[] num_list, int n) {
        int answer = 0;
        for(int i = 0; i < num_list.length; i++){
            if(num_list[i] == n){
                return 1;
            }
        }
        return answer;
    }
}

 

[반성할 점]

  • 처음에 for문 안에 n이면 answer에 1을 넣어주고 아니면 0을 넣어주도록 코드를 작성했다.
  • 계속 오류가 나서 생각해보니 위와 같은 코드면 num_list가 끝날 때까지 answer의 값이 계속 바뀔 것이고
  • 만약 num_list의 마지막 요소가 n과 같으면 1이 리턴되겠지만
  • 마지막 요소가 n과 같지 않으면 0이 나올 것이기 때문에
  • n이 i번째의 요소와 같으면 바로 return 1을 해주는 것이 맞다고 생각하였다.
728x90
728x90

[문제 설명]

한 자리 정수로 이루어진 문자열 num_str이 주어질 때, 각 자리수의 합을 return하도록 solution 함수를 완성해주세요.

 

[입출력 예]

num_str result
"123456789" 45
"1000000" 1

 

[차근 차근 생각해보기]

  1. num_str을 한자리 씩 나눈 후
  2. String 배열에 담아준 다음
  3. str의 길이 만큼 돌면서
  4. str의 i번째 요소를 정수로 변환하여 answer에 더해준다.

[결과]

class Solution {
    public int solution(String num_str) {
        int answer = 0;
        
        String[] str = num_str.split("");

        for(int i = 0; i < str.length; i++){
            answer += Integer.parseInt(str[i]);
        }
        
        return answer;
    }
}

 

[반성할 점]

  • 처음에 split메소드로 나누어 주지 않고 num_str 길이까지 돌면서 charAt()으로 요소를 가져왔다.
  • 하지만 char 타입은 정수로 파싱이 되지 않아
  • split으로 나눈 다음 배열에 담아주고 i번째 요소를 정수로 변환하여 더해주는 방식을 택했다.
  • 찾아보니 charAt()으론 Character.getNumericValue() 메소드로 정수를 변환해 줄 수 있다고 한다.
    • 대신 주어진 문자가 0 ~ 9사이의 숫자인 경우에만 해당 숫자를 반환하고 그 외엔 -1을 반환한다.
728x90
728x90

[문제 설명]

정수 리스트 num_list가 주어질 때, 첫 번째로 나오는 음수의 인덱스를 return하도록 solution 함수를 완성해주세요. 음수가 없다면 -1을 return합니다.

 

[입출력 예]

num_list result
[12, 4, 15, 46, 38, -2, 15] 5
[13, 22, 53, 24, 15, 6] -1

 

[차근 차근 생각해보기]

  1.  num_list의 길이 만큼 돌면서
  2.  num_list의 i번째 요소가 음수이면
  3. 인덱스를 반환하고
  4.  음수가 없으면 -1을 반환하기

 

[결과]

class Solution {
    public int solution(int[] num_list) {
        int answer = -1;
        
        for(int i = 0; i < num_list.length; i++){
            if(num_list[i] < 0){
                return i;
            }
        }
        return answer;
    }
}

 

[반성할 점]

  • num_list의 i번째 요소가 음수이면 [answer = i] 를 해주었더니 테스트 통과가 되지 않았다.
  • 문제에서 '첫번째'로 나오는 음수의 인덱스를 return하도록 해주어라 라고 조건이 명시 되어 있었고
  • 나는 한 배열에서 음수가 여러개 나올 것이라는 것을 고려하지 못했다.
  • 앞으로는 문제 잘 읽고 조건 하나하나 생각해보기..

 

728x90
728x90

[조건]

- 인터페이스를 이용하여 놀이공원 티켓 구입 하는 프로그램 만들기

 

public interface AmusementPark{
    void buyTicket();
}

public class TicketBox implements AmusementPark{
    @Override
    public void buyTicket(){
        System.out.println("티켓을 구입합니다.");
    }
}

public class Adult{
    private AmusementPark amusementPark;

    public void setAmusementPark(AmusementPark amusementPark){
        this.amusementPark = amusementPark;
    }

    public void price(){
        System.out.println("입장료는 50000원 입니다.");
    }

    public void buyTicket(){
       this.amusementPark.buyTicket();
    }
}
public static void main(String[] args){
    Adult adult = new Adult();
    adult.setAmusementPark(new TicketBox());
    adult.buyTicket();
}

// 실행 결과 => 티켓을 구입합니다.

 

[반성할 점]

아직 인터페이스에 대해 개념이 잘 안잡힌 것 같다.

조금 더 공부 후에 간단한 프로그램을 다시 만들어봐야할 것 같다.

728x90

'Java' 카테고리의 다른 글

[Collection 프레임워크] - ArrayList  (0) 2023.06.12
제네릭과 제네릭 클래스 / Wrapper 클래스  (0) 2023.06.12
인터페이스  (0) 2023.06.08
추상클래스  (0) 2023.06.08
클래스 - 샌드위치 만들기  (0) 2023.06.07
728x90
  • 기존의 클래스는 하나의 클래스만 상속 받을 수 있는 단일 상속의 특징을 갖고 있었지만
  • 인터페이스는 다중 상속이 가능하다.
  • 클래스들이 필수로 구현해야하는 추상 메서드와 상수만 사용가능하다.

즉, 추상 클래스는 미완성된 클래스라고 하면 인터페이스는 뼈대만 제공하는 클래스라고 할 수 있다.

 

지금부터 코드를 통해 인터페이스에 대해 공부해보자..!

public class Adult {
    public void buyTicket(){
        System.out.println("티켓을 구입합니다.");
    }
}

public class Child{
    public void buyTicket(){
    	System.out.println("티켓을 구입합니다.");
    }
}

두개의 클래스는 buyTicket을 하는 공통된 기능을 사용하고 있다. 

구현해야할 코드가 많아진다면 중복 되는 코드도 많아질 것이기 때문에

공통되는 'buyTicket'을 인터페이스로 만들 수 있다.

 

// 인터페이스
public interface BuyTicket{ 
    void buyTicket();
}

public class TicketBox implements BuyTicket{
    @Override
    public void buyTicket(){
        System.out.println("티켓을 구입합니다.");
    }
}

public static void main(String[] args){
    TicketBox ticketBox = new TicketBox();
    ticketBox.buyTicket();
}

// 실행 결과 => 티켓을 구입합니다.

위와 같이 동일한 기능을 하는 코드를 중복해서 사용하기 보다는

인터페이스를 통해 중복 코드를 줄일 수 있다.

728x90

'Java' 카테고리의 다른 글

제네릭과 제네릭 클래스 / Wrapper 클래스  (0) 2023.06.12
인터페이스 - 놀이공원 티켓 구입하기  (0) 2023.06.08
추상클래스  (0) 2023.06.08
클래스 - 샌드위치 만들기  (0) 2023.06.07
클래스 - 3  (0) 2023.06.07

+ Recent posts