배열은 한번 선언하면 크기를 변경할 수 없다.
그래서 나온 것이 List이다.
List 자료형
List는 Collection 인터페이스를 구현한 인터페이스로,
배열과 다르게 동적으로 크기를 변경할 수 있는 자료구조이다.
List의 구현체로는 ArrayList, LinkedList 등이 있다.
List 선언과 초기화
List l1 = new ArrayList();
List는 다음과 같이 선언한다.
부모오브젝트 변수명 = new 자식오브젝트( );
.add( ) : 값 추가
l1.add("hello");
l1.add(1);
add( ) 는 리스트에 값을 넣을 때 사용하는 메소드이다.
리스트 l1은 위에서 선언할 때 타입을 지정해주지 않았기 때문에
String과 int형 모두 추가가 가능한 것이다.
.get( ) : 값 가져오기
System.out.println(l1.get(0));
System.out.println(l1.get(1));
.get( )은 리스트에서 인덱스를 이용해 값을 가져올 때 사용하는 메소드이다.
1행의 실행 결과는 "hello", 2행의 실행 결과는 1이 된다.
.size( ) : 리스트에 있는 값의 개수
System.out.println(l1.size());
.size( ) 는 리스트에 들어있는 값들의 개수를 구할 때 사용한다.
위에서 값을 2개 넣었으므로 실행 결과는 2가 된다.
.remove( ) : 값 지우기
l1.remove(0);
해당 인덱스에 있는 값을 지우는 메소드이다.
위 코드 실행 시 인덱스 0에 저장되어 있는 "hello"가 삭제된다.
이때 remove(0) 실행 후 인덱스 1에 저장되어 있던 정수 1은 인덱스가 0으로 바뀌게 된다.
인덱스 값이 지워진 만큼 당겨져 오게 되는 것이다.
.isEmpty( ) : 리스트에 값이 존재하는지 여부
System.out.println(l1.isEmpty());
리스트가 비어있는지를 boolean형으로 반환한다.
아직 l1리스트에는 값이 한개 존재하므로
위 코드 실행결과는 false이다.
ㄷㄷ 스프링부트 시작하면 List를 진짜 많이 사용하게 될거임
java에서 목록을 다룰 땐 List를 사용한다고 보면 됨.
db에서 값 가져올 때 대체로 List 사용.
Iterator란?
이 리스트에 있는 얘가 포함하는 모든 것들을 어떤 순서대로 돌려준다. 리턴을 한다.
얘는 for문을 쓸 수 있음.
== repeater. 반복할 수 있는. for문을 쓸 수 있는
for (var item : l1) {
System.out.println(item);
}
↑ l1에 있는 값을 item에 하나씩 꺼내 출력
for each문이라고도 함.
java 8에서 도입된 문법임.
java → 강타입 언어
그래서 항상 타입을 강제함.
위에선 var을 사용해 유연한 문법을 작성했지만 보통 저렇게 사용하지 않음.
제네릭 (Generic)
컬렉션에 타입을 지정해 주는 기능
-> 마치 반, 학과와 같다…
리스트를 선언할 때는 타입을 꼭 명시해줘야 함.
like this → List<타입>
List helloList = new List( ); 이렇게 쓰다가..
List에 들어갈 값들의 타입을 지정해줘야 하는데 이미 List로 타입이 지정되어 있음
그래서 제네릭을 사용해 타입을 지정할 수 있도록 함.
List<String> helloList = new List( );
List<String> strList = new ArrayList<>();
strList.add("hello");
strList.add(1);
그래서 위 코드의 마지막 줄에서는 오류가 발생한다.
Generic을 String으로 지정해 주었기 때문에 정수는 추가할 수 없음.
제네릭 안쓰면
for문 등 반복해서 사용 시 타입을 예측할 수 없음으로 인한 불편함이 발생함.
for(var item : l1){
System.out.println(item.split()); // 사용불가
}
위의 item은 var타입이므로 String형에만 지원하는 메소드인 split을 사용할 수 없다.
List에 타입 지정 시에는 Reference Type만 가능하다.
primitive 타입은 stack 영역에 생성되고 Reference Type은 heap 영역에 생성되기 때문~!
List가 참조타입이기 때문에
Constructor, Getter, Setter
오브젝트에 값을 할당하고(Setter) 받아오는(Getter) 메소드들
오브젝트의 멤버변수에 직접 접근하는 방법을 피함.
Constructor
오브젝트에 값을 할당할 때는 constructor를 주로 사용.
public User(String name, String phoneNumber, int age) {
this.name = name;
this.phoneNumber = phoneNumber;
this.age = age;
}
Getter
public String getName() {
return name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public int getAge() {
return age;
Setter
public void setName(String name) {
this.name = name;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public void setAge(int age) {
this.age = age;
}
Getter, Setter는 필요한 것만 만듦.
age가 구체적으로 필요 없는 경우. 비즈니스 로직을 태운 메소드만 만들고
getAge() 같은 Getter는 만드는 것을 지양한다.
boolean isAdult() {
return age >= 18;
}
'멋쟁이 사자처럼 > TIL' 카테고리의 다른 글
230517 5주 3일차 TIL. 스택, DB (3) | 2023.05.17 |
---|---|
230516 5주 2일차 TIL. 선택정렬, 삽입정렬 (1) | 2023.05.16 |
230515 5주 1일차 TIL. 버블 정렬, EC2, Docker (1) | 2023.05.15 |
230508 4주 1일차 TIL. 입력 받은 높이만큼 피라미드 출력 (2) | 2023.05.09 |
230503 3주 3일차 TIL. Codeup 1274, 프로그래머스 소인수분해 (0) | 2023.05.03 |