본문 바로가기

programming/Gukbi

국비 교육 22일차 - 라이브러리 활용

728x90
반응형

자바의 정석 책으로 진도가 나가고 있는데, 지금 거의 1권이 끝나가고 있다. 거의 1권의 마지막 내용인 라이브러리 활용을 배웠다. 벌써 이 두꺼운 책을 다 떼어간다는게 믿기지 않는다

 

난 저만큼의 지식을 다 가지고 있는걸까 회의감이 살짝 든다. 

일단은 블로깅이나 마저하겠다. 

 

 

라이브러리에서 가져다가 사용할 수 있는 기능들을 배웠다. 맨처음 배웠던 것은 clone 기능이다.

package com.sist.lib;
/* 
 * 	
 * 	java.lang : import를 생략할 수 있다. 
 * 	=========
 * 	- Object
 * 	  ======= 모든 클래스의 상위클래스(최상위 클래스)
 * 		기능 (메소드) : 오버라이딩 => 매개변수, 리턴형, 메소드명
 * 			= toString() : 객체를 문자열로 변환 => (String), .toString() 
 * 			= finalized() : 소멸자 (객체가 메모리에서 해제 => 자동 호출)
 * 			= clone() : 복제 (새로운 메모리 제작)
 * 				= 얕은 복사
 * 					A a=new A();
 * 					A b=a;
 * 				= 깊은 복사
 * 					A a=new A();
 * 					A b=a.clone(); // 나중에 a 값을 변경해도 변경된 값을 얻어올 수 있음 
 * 	- String
 * 	- StringBuffer/StringBuilder
 * 	- Math
 * 	- Wrapper
 * 		모든 데이터형을 클래스 => 데이터를 쉽게 제어할 수 있게 만든 클래스
 * 			=> 모든 데이터형 = 문자열 변환
 * 			=> 문자열 = 각데이터형으로 변경
 * 				int a=(int)"10"; (X) ==> Web, Window => String
 * 				int a = {'1', '0'} 값이 아니라 주소가 저장됨 
 * 		Byte = byte
 * 		Short = short
 * 		Long = long
 * 		Integer = int
 * 		Double = double 
 * 		Float = float
 * 		Boolean = boolean
 * 	= System
 * 		 
 */
class Box implements Cloneable
{
	private int width;
	private int height;
	public int getWidth() {
		return width;
	}
	public void setWidth(int width) {
		this.width = width;
	}
	public int getHeight() {
		return height;
	}
	public void setHeight(int height) {
		this.height = height;
	}
	/*@Override
	protected Object clone() {
		Object obj=null;
		try
		{
			obj=super.clone(); // super는 Object
		}catch (Exception ex)
		{
			
		}
		return obj;
	}*/
	public Box clone()
	{
		// 클래스는 초기값 => null 
		Object obj=null; // 지역변수는 반드시 초기값을 설정
		try
		{
			obj=super.clone();
		}catch(Exception ex) {}
		
		return (Box)obj;
	}
	
}
// clone => prototype
public class MainClass  {

	public static void main(String[] args) {
		// 싱글턴 => 스프링 - 하나의 주소값으로 여러클래스를 제어
		
		Box box1=new Box();
		box1.setWidth(100);
		box1.setHeight(100);
		
		Box box2=box1; // 대입을 하면 같은 메모리
		box2.setWidth(300);
		box2.setHeight(300);

		System.out.println("box1-> width:"+box1.getWidth());
		System.out.println("box1-> height:"+box1.getHeight());
		
		System.out.println("==========================");
		
		// 리턴형이 obj이기 때문에 형변환 시켜줘야함 
		Box box3=box1.clone(); // 복사를 하면 다른 메모리
		System.out.println("box3-> width:"+box3.getWidth());
		System.out.println("box3-> height:"+box3.getHeight());
		
		box3.setWidth(500);
		box3.setHeight(500);
		
		System.out.println("box1-> width:"+box1.getWidth());
		System.out.println("box1-> height:"+box1.getHeight());
		
		System.out.println("box3-> width:"+box3.getWidth());
		System.out.println("box3-> height:"+box3.getHeight());

		System.out.println("==========================");
		
		System.out.println("box1="+box1);
		System.out.println("box2="+box2);
		System.out.println("box3="+box3);
		
		// 싱글턴 - 하나의 주소값으로 여러개를 제어하는 것, 참조해서 가져다 쓴다
	}

}

아래 소스 코딩에서 확인할 수 있듯이 대입을 하면 같은 메모리를 사용하고, 복사를 하면 다른 메모리 주소를 사용하는 것을 볼 수 있다. 그렇기 때문에 box2의 값을 변경하면 box1의 값 역시 같이 바뀌지만, 다른 메모리 주소를 사용하는 box3의 값을 바꾼다고 해도 box1의 값은 바뀌지 않는다. 

 

package com.sist.main;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;

/*
 *    라이브러리 (API) : 변경할 수 없다 , Framework : 변경이 가능 
 *    ==============
 *      java.lang.* : import에서 생략이 가능 => 자바에서 자주 사용되는 클래스 
 *        = Object :
 *        ***= String
 *        = StringBuffer / StringBuilder
 *        = Math
 *        ***= Wrapper(기본형 데이터형=>클래스형으로 변경)
 *        = System
 *      java.util.* 
 *        = Date , Calendar
 *        = StringTokenizer
 *        = Scanner
 *        = Collection
 *            List , Set , Map
 *        = Arrays
 *      java.io.*
 *      java.net.*
 *      java.text.*
 *      java.sql.*
 *      =============
 *      java.lang.*
 *      ========================
 *      Object : 모든 믈래스의 조상 클래스 
 *      기능(메소드) :  clone() : 메모리 복제 
 *                   finalized() : 소멸자    A() ~A()
 *                   toString() : 객체를 문자열로 변환 => 주소 
 *                   equals() : 객체 비교 
 *                 => 모든 클래스를 한개오 모아서 관리 (Object:모든 데이터형을 소화 할 수 있다)
 */
/*
 *    객체 생명주기  A 
 *    
 *    => 생성 (메모리 저장)  ===> 기능 활용(메소드 호출) ===> 메모리 해제
 *       new A()               a.display()            a=null; ==> GC
 */
class F
{

	public F()
	{
		System.out.println("A객체 생성...");
	}
	public void display()
	{
		System.out.println("A객체 활용...");
	}
	@Override
	protected void finalize() throws Throwable {
		// 객체가 소멸될때 자동 호출된다 
		System.out.println("A객체 소멸...");
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "Hello";
	}
	
}
public class MainClass2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        F a=new F();
        System.out.println(a.toString());
        System.out.println(a);// 객체를 출력 => 자동 toString()을 호출한다 
        a.display();
        a=null;
        System.gc();// 멀티미디어 => 소멸자 메소드를 호출할때 주로 사용
        try
        {
        	FileReader fr=new FileReader("");
        	Class.forName("");
        }catch(FileNotFoundException | ClassNotFoundException e)
        {
        	if(e instanceof FileNotFoundException)
        	{
        		System.out.println("파일을 찾을 수 없다");
        	}
        	if(e instanceof ClassNotFoundException)
        	{
        		System.out.println("클래스를 찾을 수 없다");
        	}
        	//System.out.println(e.getMessage());
        }
	}

}

finalize를 사용하면 객체가 자동으로 소멸된다. 원래는 garbage collection이 자동으로 소멸시켜 주지만, 시스템을 종료하고 바로 소멸시키는 것이 아니기 때문에, 바로 소멸시키는 것을 원할때는 finalize 를 사용하는게 좋다. 

 

 

이 다음에는 String 활용에 대해 배웠다. 양이 많은데 한꺼번에 진도를 훅훅 나가서 정말 힘들었다. 

 

package com.sist.string;
/*
 * 	스트링 클래스
 * 	=========
 * 		char[]을 제어하는 프로그램
 * 		String => 클래스
 * 			   => 문자열을 저장
 * 			   => 문자열을 쉽게 제어가 가능하게 만든 클래스
 * 			   => 문자열을 저장하는 일반 데이터형으로 사용이 가능
 * 					*** String name=" "
 * 					String name=new String("");
 * 	String 클래스는 Call By Reference를 사용 할 수 없다 
 * 	
 * 	=> 메소드 호출
 * 		값만 전송 : Call By Value (복사본) => 기본데이터형 (int a, int b)
 * 		주소 전송 : Call By Reference    => 배열, 클래스 (A a) => String은 예외 조건 
 * 	=> 클래스와 클래스연결 => 메소드호출 
 * 
 * 	String에서 기능
 * 	============
 * 	변환 // 원본은 바뀌지 않음
 * 	 = 대문자 변경 : toUpperCase() => "aaa.toUpperCase() => "AAA" String
 * 	 = 소문자 변경 : toLowerCase() => String 
 * 	 = 공백문자 제거 : 좌우의 공백만 제거 => trim() // 사용자가 스페이스를 잘못 누를 수 있음 
 * 	 = 문자열 결합 : concat() => 빈도가 작다 (+)가 있기 때문애
 * 	
 * 	제어
 * ##### 모든 문자열은 시작번호가 0번부터 시작한다 
 * 	"Hello Java"
 * 	 0123456789 ==> length():10	
 * 	 = 문자열 길이 : length() // 공백까지 포함됨
 * 	 = 문자 한개를 가지고 온다 : charAt(6) , 0번부터 시작함 'J'글자를 가져오게 되는 것
 * 	 ===================================================
 * 	 = 시작문자열 : startsWith()
 *	 = 끝나는 문자열 : endsWith()
 * 	 ====================================검색기제작에 많이 쓰임
 * 	 = 포함문자 : contains() - 추천기능에 많이 쓰임
 * 	 = 문자비교 : equals()-대소문자 구분, equalsIgonoreCase()-대소문자 구분없이 비교
 * 		"Hell.o.java" => 
 * 	 = 문자위치 찾기 : indexOf()-맨처음에 등장하는것, lastIndexOf()-맨마지막에 있는거 찾아감
 * 	 	"ABCDEF".replace('A', 'K') ==> KBCDEF	
 * 	 = 문자변화 : replace-한글자, replaceAll-정규식
 * 		"abcAbc1234한글" => replaceAll("[^0-9]","") => "1234" 
 * 		숫자 [0-9]
 * 		알파벳[A-Z][a-z] => [A-Za-z]
 * 		한글 [가-힣]
 * 	 = 문자분해
 * 		= split : 구분자별로 배열에 저장
 * 		= substring : 문자의 위치 지정
 * 	 = 객체를 문자열로 변환 : toString() 
 * 	 = 모든 데이터형을 문자열로 변환 => valueOf()
 *   = 문자 크기 비교 (정렬) : "ABC" "ACD" compareTo() int => 같다(0), 왼쪽: 1, 오른쪽 -1
 * 	
 */
public class MainClass {

	public static void main(String[] args) {
		
		String str="hello";
		String s=str.toUpperCase();
		System.out.println(str); // hello

	}

}

사실상 위에 적힌 내용들을 전부 복습하는게 끝이었다. 단 예시 코드들을 활용해서 체득하는 과정이었는데 여튼 단순 작업 느낌이라 조금 힘들었다. 

 

package com.sist.string;
/*
 *    1. String 메소드 
 *       = int length()
 *       = char charAt(int no)
 */
import java.util.Scanner;
public class MainClass2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        /*Scanner scan=new Scanner(System.in);
        System.out.print("문자열 입력:");
        String msg=scan.next(); // 문자열  => 정수 nextInt() , 문자열 => next()
        System.out.println("msg="+msg);
        System.out.println("문자 갯수:"+msg.length());*/
        
        // 문자열이 좌우 대칭인지? => Google  => 이미지를 뒤집어서 출력 
		Scanner scan=new Scanner(System.in);
        //System.out.print("문자열 입력:");
        /*String msg=scan.next();
        for(int i=msg.length()-1;i>=0;i--) 
        {
            System.out.print(msg.charAt(i));	
        }*/
        String msg="";
		while(true)
		{
			System.out.print("문자열 입력:");
			msg=scan.next();
			if(msg.length()%2!=0)
			{
				System.out.println("짝수개의 문자가 필요합니다");
				// while처음으로 이동
				continue;
			}
			break;// while종료 
		}
		// 변수 => 사용범위 => {} 
		// ABCCBA
		/*
		 *   012
		 *   543
		 */
		boolean bCheck=true;
		for(int i=0;i<msg.length()/2;i++)
		{
			// ABC CCA
		   char s=msg.charAt(i);
		   char e=msg.charAt(msg.length()-1-i);
		   if(s!=e)
		   {
			   bCheck=false;
			   break;
		   }
		}
		
		// 결과값
		if(bCheck==true)
			System.out.println("좌우 대칭입니다");
		else
			System.out.println("좌우 대칭이 아닙니다");
		
        // if의 사용 목적 => 오류 처리
		// 오류방지 => 시스템 (try~catch), 프로그램(if)
	}

}

입력받은 문자열이 좌우 대칭인지 확인하는 코드이다. while문을 사용해서 입력된 문자열이 짝수개수인지 확인을 해준다. 그리고 나서 for문을 사용해서 앞의 문자들과 뒤의문자들을 하나씩 비교한다. 

 

만약 좌우 대칭이 아니라면 bCheck에 false값을 주고 빠져나와서 좌우대칭인지 확인해주는 프로그램이다. 

 

 

package com.sist.string;
/*
 *  trim() : 좌우에 있는 공백문자 제거 (좌우에 있는 모든 공백을 제거한다)
 *  		예) " Hello Java ".trim() ==> "Hello Java" // 가운데 공백은 지우지 못하고 좌우에 있는 공백을 지워줌
 *			사용) 검색어, 로그인 처리, 아이디중복, 게시판 비밀번호 처리
 *	리턴형 : String 
 *	매개변수 : 없음
 *	원형 : public String trim() 
 *
 *  valueOf() : 모든 데이터형을 문자열로 변환할때 사용 - 오버로딩이 많음
 *  			100 => "100"
 *  			true => "true"
 *  리턴형 : String 
 *  매개변수 : valueOf(char c)
			 valueOf(int i)
			 valueOf(long l)
			 valueOf(float f)
			 valueOf(double d)
			 valueOf(boolean b)
			 valueOf(Object o)
	원형 : public static String valurOf(데이터형)
	
			 100 => int a-100;
			 		String s(String)a;
			 
			 */
public class MainClass8 {

	public static void main(String[] args) {
		String msg="            Hello Java ";
		System.out.println(msg);
		System.out.println(msg.length()); // 공백도 문자
		
		String msg2=msg.trim();
		System.out.println(msg2);
		System.out.println(msg2.length());
			
		int a=100;
		int b=200;
		String s=String.valueOf(a); // s="100"
		String s1=String.valueOf(b); // s1="200"
		String s2=String.valueOf(false); // s2="false"
		String s3=String.valueOf(10.5); // s3="10.5"
		
	
	}

}

trim()은 문자의 공백을 지워주는 메소드, valueOf()는 그 안의 값을 전부 문자열로 변환해주는 메소드이다. 

활용은 위와 같이 할 수 있다. 

 

package com.sist.string;

public class MainClass10 {

	public static void main(String[] args) throws Exception {
		
		String color="red,blue,green";
		String[] colors=color.split(",");
		String str=String.join("-",  colors); // red-blue-green
		System.out.println(str);
		
		//String s=String.format("%d*%d=%d", 10,20,10+20);
		//System.out.println(s);
		
		int year=2021;
		int month=1;
		int day=22;
		String s=year+"년도 "+month+"월 "+day+"일";
		System.out.println(s);
		String s2=String.format("%d년도 %d월 %d일", year, month, day);
		System.out.println(s2);
		
		
	}

}

split 과 format 메소드를 활용하는 방식이다. 별 다른건 없다. 그냥 저렇게 사용하는 구나 알고 있으면 될 것 같다. 사실 이 메소드들은 내가 원하면 언제든지 구글링해서 사용방법을 알 수 있기 때문에 꼭 다 외우고 넘어가야 한다거나 그런 부담은 갖지 않아도 될 것 같다. 

 

 

그럼 오늘의 블로깅 끝

 

 

 

728x90
반응형