[JAVA]Collection(컬렉션),문자열 클래스

신동혁·2022년 8월 12일
0

JAVA

목록 보기
8/16

1. API

API : application programmng interface

  • 제공받아서 사용하는 모든 클래스, 메소드, 변수 ...
    ex) 카카오 API란?
    - 지도를 사용해서 개발해야할 개발자들이 가져다가 사용한 library의미
    - 개발자와 map 간에 상호호완 인터페이스(중간매개체)
  • 자바의 장점
    - 예외처리로 인한 견고한 개발 가능
    - 제공하는 API들이 많다(파이썬이 훨씬 많긴 함)
  • 주요한 유요한 API
    데이터를 어떻게 관리할 것인가에 대한 다양한 구조의 기능 : 특정 기능의 클래스에 메서드로 제공

2. 자바 API 자료구조 클래스( 컬렉션 프레임워크 )

기본관용용어

  • E(element) / T(type) / K(key) / V(value)

공통된 특징

  • 기본타입 8가지(int,double...) 사용 불가능
  • 객체들만 저장가능
  • 동적메모리 제공
  • API로 제공하여 생성해서 사용만함 --> 사용하기 위해 [java.util.package] import필수

2.1 list계열구조

  • ArrayList ...
    - 순서존재
    - 중복데이터 저장 가능
    - index 이용해 관리
// 선언및초기화
ArrayList<String> 어레이리스트 = new ArrayList<String>();

// 데이터추가
어레이리스트.add("안녕");
어레이리스트.add("hi");
어레이리스트.add(3,"잘가");

// 크기반환
int b = 어레이리스트.size();
System.out.println(b);

// 인덱스로 데이터반환
String a=어레이리스트.get(0);
System.out.println(a);


// 인덱스로 데이터삭제
어레이리스트.remove(0);
System.out.println(어레이리스트);

2.2 set계열구조

  • HashSet, Iterator ...
  • 순서존재 X
  • 중복데이터 저장 X
  • index 이용해 관리 X
// HashSet 선언및초기화
HashSet<String>= new HashSet<String>();

// HashSet 데이터추가.add("안녕");.add("hi");.add("안녕"); //이미 존재하던 "안녕"을 삭제한 후 "안녕"추가
System.out.println(); // 출력 : [hi, 안녕]

// Iterator 선언및초기화
Iterator<String> 이터레이터 =.iterator();
	
// Iterator 데이터 유무검증
System.out.println(이터레이터.hasNext()); // 출력 : true

// Iterator 출력
while(이터레이터.hasNext()) {
	System.out.println(이터레이터.next()); // 출력: hi
}										 //     안녕
//이때 next()는 데이터를 잘라오는 메서드로 이후 다시 이터레이터를 출력하면 빈 상태를 확인할 수 있다.
while(이터레이터.hasNext()) {
	System.out.println(이터레이터.next()); // 출력: 출력 아무것도 안됨
}

2.3 map계열구조

  • HashTable
  • key와 value로 관리
  • key는 중복불가
  • valuse는 중복가능
  • key와 value는 일대일대응
// Hashtable 선언및초기화
Hashtable<String, String>= new Hashtable<String, String>();

// Hashtable 데이터추가.put("일", "김연아");.put("이", "마동석");.put("삼", "신동엽");.put("사", "유재석");
System.out.println(); // 출력화면 : {이=마동석, 일=김연아, 삼=신동엽, 사=유재석}

// Hashtable 데이터반환
System.out.println(.get("일")); // 출력화면 : 김연아

// Hashtable 데이터변경.put("일", "김연아아님");// "일"이란 key에 대한 value값을 바꿀 수 있음
System.out.println(.get("일")); // 출력화면 : 김연아아님

3. 자바 API 문자열 클래스

3.1 String

  • 편의성을 위해 " " 만으로 자동으로 객체화 가능
  • 하지만 "데이터"생성 vs new String("데이터") 차이점
    • "데이터"생성 경우 : 동일한 객체 있을 시 객체를 참조해서 사용
    • new String("데이터") 경우 : 무조건 새로운 메모리 생성
// String 선언및초기화
String s1 = "data";
String s2 = "data";
String s3 = new String("data");
String s4 = new String("data");

System.out.println(s1==s2);// 출력화면 : true   's1가 소유한주소' vs 's2 소유한주소'
System.out.println(s2==s3);// 출력화면 : false  's2가 소유한주소' vs 's3 소유한주소'
System.out.println(s3==s4);// 출력화면 : false  's3가 소유한주소' vs 's4 소유한주소'
// 즉, 변수가 가리키고 있는 String객체를 보는 것이 아니라 가리키고 있는 String객체의 주소를
// 비교하는 형식이기 때문에 다음과 같다. 큰따움표를 이용한 선언및초기화는 원래 있던 객체를 참조
// 함을 알 수 있다.

// String 데이터추가
s1.concat(" data2");
System.out.println(s1); // 출력화면 : data
// concat메서드가 원래있던 객체를 변경하는 것이 아니라 새로운 변수를 만들어내는 메서드라 그럼
String s5=s1.concat(" data2");
System.out.println(s5); // 출력화면 : data data2
// 변수 이름 그대로 유지하며 concat하고 싶다면 이렇게 해야됨.	
s1=s1.concat(" data2");
System.out.println(s1); // 출력화면 : data data2

3.2 StringBuilder

  • 한번 생성시킨 문자열 객체의 내용값 갱신시에 새로운 객체 생성하지 않고 기존 객체를 수정
  • jdk1.5부터 제시됨
  • StringBuffer 보다 문자열 처리 속도 빠름
// StringBuilder 선언및초기화
StringBuilder sb = new StringBuilder("data");

// StringBuilder 데이터추가
sb.append(" data2");
System.out.println(sb); // 출력화면 : data data2
// String과 달리 StringBuilder는 append메서드를 사용하면 원래 변수가 가리키던 객체에 변경이 적용됨.

3.3 StringBuffer (기능은 StringBuilder와 동일)

  • (한번 생성시킨 문자열 객체의 내용값 갱신시에 새로운 객체 생성하지 않고 기존 객체를 수정)
  • jdk1.0부터 제시됨

4. 제네릭( Generic )

컴파일 시에 미리 타입을 정해주는 기능
ex) 제네릭을 사용하는 이유

public void m12() {
	ArrayList a=new ArrayList();
	a.add("안녕");
	System.out.println(a);  // 출력화면 : [안녕]
	
	String hi = a.get(0);
	// 오류발생 : Type mismatch
}

다음처럼 a.get(0)은 "안녕"이라는 String값인데 왜 Type mismatch라는 오류가 생길까?

이유는 a.get(0)에 들어간 "안녕"이 ArrayList에 제네릭으로 String타입지정을 하지 않았으므로 더 상위단계인 Object타입으로 생각되기 때문이다.

--->해결을 위해 : String hi = a.get(0); ---> String hi = (String)a.get(0); 이런식의 형변환이 필요하다.

이런 추가적인 형변환 작업의 불편함을 없에기 위해 제네릭을 사용한다.

4.1 형변환이란?

형변환은 데이터타입을 바꾸는 작업을 뜻한다. 이때 기본자료형에서 boolean(논리타입)은 다른 타입과 형변환이 불가하다.

  • upcasting(묵시적 형변환)

ex)
int a = 20;
byte b = 2;

a = b;

int는 32bit이고 byte는 8비트다. 8비트짜리 변수b를 32비트짜리 변수a에 넣는다면 문제없이 들어간다. 그러므로 단순하게 'a=b;'와 같은 식으로 형변환을 진행한다.

  • downcasting(명시적 형변환)

ex)
int a = 20;
byte b = 2;

b = (byte)a;

int는 32bit이고 byte는 8비트다. 32비트짜리 변수a를 8비트짜리 변수b에 넣는다면 비트가 모자라 문제가 생긴다. 그러므로 32비트 변수a를 8비트 변수로 'b = (byte)a;'와 같은 식을 통해 형변환을 진행한다.

4.2 Autoboxing / Unboxing

	public void m3() {
		int i =3;
		Integer i2 = new Integer(3);
		
		//unboxing
		int i3 = new Integer(3); //int i3=(new Integer(3)).intValue(); 즉 알아서 intValue메서드를 실행해서 int기본타입으로 변경함.
		
		//autoboxing
		Integer i4=3; //Integer i4=new Integer(3);  즉 int 기본값3을 객체로 변화해서 대입해준다	
	}

java.lang.package안에 기본타입8가지를 지원해주는 8개의 class가 있다. 위 코드의 경우...

int는 기본타입으로 위와 같이 선언 및 초기화를 할 수 있다. 그에 반해 Integer는 참조타입으로 new생성자를 이용해 위와 같이 선언 및 초기화를 할 수 있다.
--> 이때 Integer객체타입 3을 생성자로 생성하면 자동으로 .intvalue() 라는 메서드가 붙어 int기본타입으로 변형해준다. 이를 unboxing이라한다. 또한 Integer변수에 바로 int타입 3을 대입하면 자동으로 int타입 3을 Integer객체로 변경해주게 되고 이를 autoboxing이라고 한다.

0개의 댓글