기록
  • 1004 14일차
    2023년 10월 04일 16시 01분 57초에 업로드 된 글입니다.
    작성자: 삶은고구마

    11.jdk api

    API란

    Application 

    Programming

    Interface(규격)

    -언어뿐만이 아니라 개발에 필요한 프레임워크, 라이브러리를 부르는 말.

    -프로그램을 작성하기 위해 제공받는 기능/규격

    -API Doc에 모든 명세(spec)가 작성되어 있으니 참고 할 것.

     

    String

    1.String은 불변이다.(immutable)

    2.한 번 생성된 리터럴(값)은 변경 할 수 없다.

    3.생성된 리터럴은 heap 영역에 String constant pool(Literal pool)에 관리 된다.

    4.리터럴로 생성된 문자열 참조 변수는 Literal pool을 직접 참조한다.

    5.new 연산자를 통해 생성된 문자열 참조변수는 heap 객체를 통해 Literal pool을 직접 참조한다.

    +=로 문자열을 이어붙인다해서 기존의 String변수에 값이 갱신되는게 아니라 , 새로운 값이 만들어짐...

     

    리터럴로 생성된 문자열과 new 연산자로 생성된 문자열의 차이점

     

    StringBuilder & StringBuffer

    StringBuilder StringBuffer
    mutable한 문자열 관리 mutable한 문자열 관리
    싱글 스레드 환경 멀티 스레드 환경
    동기화(스레드 간 접근 순서 지정,지정안하면 오류발생)
    객체 내에서 직접 문자열을 관리한다.
    상수 풀 사용 안함.
    객체 내에서 직접 문자열을 관리한다.
    상수 풀 사용 안함.
    문자열 더하기 연산이 많은 경우 String보다 
    StringBuilder를 사용하는 것이 좋다.
    String += 연산으로 이어붙일때마다 상수풀에 객체가 생성됨.
    하지만 StringBuilder를 사용하면 한개로 유지하되 그 안의 값이 변경된다. 필요한 문자열 갯수가 적을땐 String을 써도 됨.
     

    CSV(Comma Separated Value:콤마로 구분 된 값)

    1.구분자로 콤마(,) 뿐 아니라 공백,특수문자 등등 사용 가능.

    2.단, 구분자가 data에 포함되어선 안된다.

    구분자 기준으로 문자열을 잘라 배열로 만들기 때문임.

    3.split, StringTokenizer

    String.split(delimiter:String):String[] StringTokenizer
    문자열.split("\n");
    처럼 구분할 문자를 괄호안에 넣는다.
    StringTokenizer st = new StringTokenizer(data, ",");
    전체문자열,구분할 문자순으로 대입
    구분자가 여러개 섞여있을 경우 다중 반복문 사용. CSV 데이터를 구분자로 쪼개서 순서대록 접근하도록
    목록화한 객체 생성.
    단, 목록은 한번 접근할 때마다 없어지므로 while문을 사용해서 출력한다.

    while(st.hasMoreTokens())//토큰이 있으면 true,없으면 false
    {
      String value = st.nextToken(); //다음 문자
      System.out.println(value);
    }

    st.countTokens(); //토큰갯수
    이것도 하나씩 끄집어낼때마다 갯수 1씩 차감

    Tokenizer 구조

    그 외..

    +multi line String (text block) 개행,들여쓰기문자 모두 포함

    //Multiline String : jdk15부터 사용 가능 (개행,문자 모두 포함)
    		String data = 
    						"""
    						사과/3000
    						배/4000
    						고구마/2000
    						토마토/1500
    						딸기/5000""";
    // 정규표현식이 필요한 split이라 이스케이프 문자를 붙여야함 ("|")로 나누면 오류.
    // vertical bar | 가 예약어라 문자열에서 인식을 못하기 때문에..\를 붙여야 하는데
    // \도 예약어라 두번 넣어야함
    String[] dataArray2 = dataArray1[i].split("\\|");

    구분자가 어떤것이냐에 따라 앞에 슬래시를 더 붙여야 하는 경우가 있다. 

     

    Wrapper Class

    1.기본형을 감싼 클래스

    2.기본형 8가지에 대응하는 클래스가 존재.(즉, 8개의 Wrapper Class가 있다)

    boolean java.lang.Boolean
    char java.lang.Character
    byte java.lang.Byte
    short java.lang.Short
    int java.lang.Integer
    long java.lang.Long
    float java.lang.Float
    double java.lang.Double

    3.존재이유(부가 기능)

    1)기본형 값을 참조형으로 사용해야 하는 경우가 있음. 

    ex)Generics

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

    2)기본형과 관련한 상수 또는 메소드(형변환)을 제공.

    ex)Integer.MAX_VALUE , Integer.parseInt("123)..

     

    4.Boxing / UnBoxing

    -모두 자동으로 처리됨.

    -Boxing:포장하다     //값->참조형

    int n = 100;

    Integer num = n;

    -Unboxing:개봉하다 //참조형->값

    int n2 = num;

     

     

    코드

    더보기
    package sh.java.string;
    
    
    /**
     * @author 고혜진
     * 2023-10-04
     * 
     * API
     * -Application Programming Interface 규격
     * -프로그램을 작성하기 위해 제공 받는 기능, 규격
     * -API Doc에 모든 명세가 작성되어 있으니 참고해야함.
     * 
     * 
     * 
     */
    public class StringStudy 
    {
    	public static void main(String[] args)
    	{
    		StringStudy study = new StringStudy();
    		//study.test1();
    		//study.test2();
    		study.test3();
    	}
    	
    	
    	/**
    	 * <pre>
    	 * String은 immutable이다.
    	 * - 한 번 생성된 리터럴은 변경불가
    	 * - 생성된 리터럴은 heap 영역에 String constant pool(Literal pool)에 관리됨
    	 * - 리터럴로 생성된 문자열 참조변수는 literal pool을 직접 참조.
    	 * - new 연산자를 통해 생성된 문자열 참조변수는 heap영역 객체를 통해 literal pool을 직접 참조.
    	 * 
    	 */
    	public void test1()
    	{
    		String str = "hello";
    		System.out.println(str.hashCode());
    		str+= "world"; //기존의 "hello"를 변경하지 않고, 새롭게 "helloworld" 생성후 참조
    		System.out.println(str);
    		System.out.println(str.hashCode());
    	}
    	
    	public void test2()
    	{
    		String str1 = "java";
    		String str2 = "java";
    		String str3 = new String("java");
    		String str4 = new String("java");
    		
    		System.out.println(str1.hashCode()); //3254818
    		System.out.println(str2.hashCode()); //3254818
    		System.out.println(str3.hashCode()); //3254818
    		System.out.println(str4.hashCode()); //3254818
    		
    		System.out.println(str1.equals(str2)); //true
    		System.out.println(str2.equals(str3)); //true
    		System.out.println(str3.equals(str4)); //true
    		
    		//주소값 비교
    		System.out.println(str1==str2); //true
    		System.out.println(str2==str3); //false
    		System.out.println(str3==str4); //false
    
    	}
    	/*
    	 * 문자열 변경
    	 * 
    	 */
    	public void test3()
    	{
    		String str = "java";
    		System.out.println(str.hashCode()); //3254818
    		str = "oracle";
    		System.out.println(str.hashCode()); //-1008861826
    		
    		String str2 = new String("java");
    		System.out.println(str2.hashCode());//3254818
    		str2 = new String("oracle");
    		System.out.println(str2.hashCode());//-1008861826
    		
    	}
    	
    	public void test4()
    	{
    		
    	}
    }

     

    package sh.java.string;
    
    
    /**
     * 
     *<pre>
     * @author 고혜진
     * 2023-10-04
     * 
     * 1.StringBuilder
     * -mutable한 문자열 관리
     * -싱글스레드 환경에서 사용
     * -객체 내에서 직접 문자열을 관리 상수풀 사용안함
     * -멀티스레드 환경보다 버퍼보다 빌더를 사용
     * 
     * 2.StringBuffer
     * -mutable한 문자열 관리
     * -멀티스레드 환경에서 사용 - 동기화(스레드간 접근순서 지정) 지원 /접근순서가 지정되지 않으면 오류발생
     * -객체 내에서 직접 문자열을 관리 상수풀 사용안함
     */
    
    
    
    public class StringBuilderStudy 
    {
    	public static void main(String[] args)
    	{
    		StringBuilderStudy study = new StringBuilderStudy();
    		study.test2();
    		
    	}
    	
    	/**
    	 * StringBuilder
    	 * -문자열 더하기 연산이 많은 경우 String 보다 StringBuilder 성능이 좋다.
    	 */
    	private void test1()
    	{
    		StringBuilder sb = new StringBuilder("java");
    		//sb+="oracle"; <<이런식으로는 사용 못함
    		System.out.println(sb);
    		System.out.println(sb.hashCode());
    		sb.append("oracle");
    		System.out.println(sb);
    		System.out.println(sb.hashCode()); //문자열을 이어붙여도 해시코드가 변경되지 않음
    		
    		
    		//아래처럼 사용하는 경우 리터럴풀에 객체 5개 생성됨..
    		//반면 StringBuilder로 사용하면 동일한 객체 1개만 존재.
    		//갯수가 적을땐 String쓰고 많을땐 StringBuilder.
    		String str = "java";
    		str += "oracle";
    		str += "html";
    		str += "css";
    		str += "js";
    		
    	}
    	
    	/**
    	 * StringBuffer
    	 * 
    	 */
    	private void test2()
    	{
    		StringBuilder sb = new StringBuilder("java");
    		sb.append("oracle");
    		sb.append("html");
    		sb.append("css");
    		sb.append("js");
    		System.out.println(sb);
    		
    	}
    	
    	
    }

     

    package sh.java.string;
    
    import java.util.Arrays;
    import java.util.StringTokenizer;
    
    /**
     *<pre>
     * @author 고혜진
     * 2023-10-04
     * 
     * CSV
     * -Comma Separated Value 콤마로 구분 된 값
     * -구분자로 ,뿐 아니라 공백 등 특수문자로 사용 가능
     * -단, 구분자가 data에 포함되어선 안된다..
     * 
     * 1.split
     * 2.StringTokenizer
     *
     */
    public class SCVDataHandling 
    {
    	public static void main(String[] args)
    	{
    		SCVDataHandling study = new SCVDataHandling();
    		//study.test1();
    		//study.test2();
    		//study.test3();
    		//study.test4();
    		study.test5();
    	}
    
    	//test3을 Tokenizer로 변경해보기~
    	//Tokenizer는 split와 다르게 정규표현식으로 사용 안해도됨.
    	private void test5() {
    	
    			String data = """
    					농담곰|남|010-1234-5678
    					고로케|여|010-3333-3333
    					퍼그씨|남|010-7777-8888
    					""";
    			StringTokenizer st = new StringTokenizer(data, "\n");
    			Person[] p = new Person[st.countTokens()];
    			int personCount=0;
    			while(st.hasMoreTokens())//토큰이 있으면 true,없으면 false
    			{
    				String value = st.nextToken();
    				StringTokenizer st2 = new StringTokenizer(value, "|");
    				String name = st2.nextToken();
    				char gender = st2.nextToken().charAt(0);
    				String phone = st2.nextToken();
    				p[personCount++] = new Person(name,gender,phone);
    			}
    			//Person[] 출력
    			for(int j=0; j<p.length; j++)
    			{
    				System.out.println("이름:"+p[j].getName()+
    									",성별:"+p[j].getGender()+
    									",전화번호:"+p[j].getPhone());
    			}
    			for(Person p2 : p)
    			{
    				System.out.println(p2);
    			}
    
    		
    	}
    
    	/**
    	 * StringTokenizer
    	 */
    	private void test4() 
    	{
    		String data = "java,oracle,html,css,js";
    		//csv데이터를 구분자로 쪼개서 순서대로 접근가능하도록 목록화한 객체 :st
    		//목록은 한번 접근할때마다 없어짐..
    		StringTokenizer st = new StringTokenizer(data, ",");
    		System.out.println(st.countTokens());//토크나이저의 갯수
    		while(st.hasMoreTokens())//토큰이 있으면 true,없으면 false
    		{
    			String value = st.nextToken();
    			System.out.println(value);
    			System.out.println(st.countTokens());//토크나이저의 갯수
    		}
    		
    	}
    
    	/**
    	 * CSV->Person클래스 객채배열
    	 */
    	private void test3() {
    
    		Person[] p = new Person[3];
    		
    		String data = """
    				홍길동|남|010-1234-5678
    				신사임당|여|010-3333-3333
    				허각|남|010-7777-8888
    				""";
    		//
    		String[] dataArray1 = data.split("\n");
    		for(int i=0; i<dataArray1.length; i++)
    		{
    			//정규표현식이 필요한 split이라 이스케이프 문자를 붙여야함 ("|")로 나누면 오류.
    			//vertical bar | 가 예약어라 문자열에서 인식을 못하기 때문에..\를 붙여야 하는데
    			//\도 예약어라 두번 넣어야함
    			String[] dataArray2 = dataArray1[i].split("\\|"); 
    			p[i] = new Person(dataArray2[0],dataArray2[1].charAt(0),dataArray2[2]);
    		}
    		
    		
    		//Person[] 출력
    		for(int j=0; j<p.length; j++)
    		{
    			System.out.println("이름:"+p[j].getName()+
    								",성별:"+p[j].getGender()+
    								",전화번호:"+p[j].getPhone());
    		}
    		
    	}
    
    
    	/**              구분자
    	 * String.split(delimiter:String):String[]
    	 */
    	private void test1() 
    	{
    		String data = "사과 배 고구마 딸기 토마토 바나나";
    		String[] values = data.split(" ");
    		System.out.println(Arrays.toString(values));
    		for(String str : values)
    		{
    			System.out.println(str);
    		}
    	}
    	
    	
    	/**
    	 * 
    	 */
    	private void test2() 
    	{
    		//Multiline String : jdk15부터 사용 가능 (개행,문자 모두 포함)
    		String data = 
    						"""
    						사과/3000
    						배/4000
    						고구마/2000
    						토마토/1500
    						딸기/5000""";
    		
    		//System.out.println(data);
    		//data에 두개의 구분자가 있음 . /와 개행
    		String[] values = data.split("\n"); //개행부터 처리하고
    		for(int i=0; i<values.length; i++)
    		{
    			System.out.println(values[i]);
    			String[] info = values[i].split("/");
    			String name = info[0];
    			int price = Integer.parseInt(info[1]);
    			System.out.println("이름:"+name+",가격:"+price+"원");
    		}
    	}
    }

     

    package sh.java.string;
    
    public class Person 
    {
    	private String name;
    	private char gender;
    	private String phone;
    	
    	public Person()
    	{
    		
    	}
    	
    	public Person(String name, char gender, String phone)
    	{
    		this.name = name;
    		this.gender = gender;
    		this.phone = phone;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public char getGender() {
    		return gender;
    	}
    
    	public void setGender(char gender) {
    		this.gender = gender;
    	}
    
    	public String getPhone() {
    		return phone;
    	}
    
    	public void setPhone(String phone) {
    		this.phone = phone;
    	}
    
    	@Override
    	public String toString() {
    		return "Person [name=" + name + ", gender=" + gender + ", phone=" + phone + "]";
    	}
    	
    	
    	
    }

     

    package sh.java.wrapper;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @author user1
     * 2023-10-04
     * 
     * Wrapper Class
     *  -감싼 클래스
     *  -기본형 값을 감싼 클래스
     *  -기본형 8가지에 대응하는 클래스가 존재(wrapper클래스도 8개) 
     *  -boolean -> java.lang.Boolean
     *  -char - > java.lang.Character
     *  -byte -> java.lang.Byte
     *  -short -> java.lang.Short
     *  -int -> java.lang.Integer
     *  -long -> java.lang.Long
     *  -float -> java.lang.Float
     *  -double -> java.lang.Double
     * 
     * 존재이유
     * 1.기본형값을 참조형으로 사용해야 하는 경우 - Generics
     * 2.기본형과 관련한 상수 또는 메소드(형변환)를 제공.
     * 
     * Boxing / Unboxing
     * -모두 자동으로 처리된다.
     * -Boxing:값(기본형) -> 참조형
     * -Unboxing:참조형->값
     * 
     *  
     *  
     */
    public class WrapperStudy {
    
    	public static void main(String[] args) 
    	{
    		WrapperStudy study = new WrapperStudy();
    //		study.test1();
    //		study.test2();
    		study.test3();
    		
    	}
    
    	/**
    	 * Wrapper제공 부가 기능
    	 * -상수
    	 * -형변환 메소드
    	 * 
    	 */
    	
    	private void test3() {
    		System.out.println(Integer.MIN_VALUE); //상수
    		System.out.println(Integer.MAX_VALUE); //상수
    		
    		//문자열->각 타입으로 변환
    		int n = Integer.parseInt("123");
    		double d = Double.parseDouble("12345.55");
    		boolean bool = Boolean.parseBoolean("true");
    		//Character은 parseCharacter 없음 charAt ㄱㄱ
    		 
    	}
    
    
    	/**
    	 * 기본형이 아닌 참조형만 허용되는 경우
    	 * -Generics
    	 */
    	private void test2() {
    		//int값 여러개를 관리하는 객체
    		ArrayList<Integer> nums = new ArrayList<Integer>();
    		//ArrayList<int> nums = new ArrayList<int>(); //오류
    		
    	}
    
    	private void test1() {
    		int n = 100;
    		Integer num = n; //기본형->참조형(boxing)
    		//Integer num = Integer.valueOf(n); //풀어쓰면 이렇게 됨
    		
    		int n2 = num; //참조형->기본형(unboxing)
    		//int n2 = num.intValue(); //풀어쓰면 이렇게 됨
    		
    		System.out.println(n+num);//200
    		//연산하면 int+Integer -> int+Integer.intValue();
    	}
    	
    
    }

     

    '공부' 카테고리의 다른 글

    1006(16일차)  (0) 2023.10.06
    1005(15일차)  (0) 2023.10.05
    0927 13일차  (0) 2023.09.27
    0926 12일차  (0) 2023.09.26
    0925 11일차  (0) 2023.09.25
    댓글