[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이라고 한다.

profile
개발취준생

0개의 댓글