멀티캠퍼스 백엔드 과정 17일차[6월 23일] - java.base 모듈

GoldenDusk·2023년 6월 30일
0

java.base 모듈

1. API 도큐먼트

자바표준라이브러리 API 문서 찾아보고 활용하는 방법

Java Platform, Standard Edition Documentation - Releases

Java Development Kit Version 17 API Specification

2. object 클래스

object 클래스

  • 클래스를 선언할 때 extends 키워드로 다른 클래스를 상속하지 않으면 암시적으로 java.lang.Object 클래스를 상속

⇒ 자바의 모든 클래스는 Object의 자식이거나 자손 클래스

객체 동등 비교

  • Object의 equals() 메소드는 객체의 번지를 비교하고 boolean 값을 리턴
public boolean equals(Object obj)

객체 해시코드

  • 객체를 식별하는 정수를 의미
public int hashCod3()
  • 객체의 메모리 번지를 이용해서 해시코드를 생성하기 때문에 객체마다 다른 정수값을 가지고 있다. 이를 리턴해서 확인하는 기능 두 객체가 동등(같은 객체인지 비교할 때 사용)
  • 객체의 데이터를 기준으로 재정의해서 새로운 정수값을 리턴하도록 사용하는 것이 일반적

해시코드 예제

public class Student extends Object
{
	private int no;
	private String name;

	public Student(int no, String name) {
		this.no = no;
		this.name = name;
	}

	// Student 객체를 동등비교하기 위해 hashCode(), equals() 메소드를 재정의
	// 학생번호와 이름으로 해시코드 생성하고, 학생번호와 이름이 동일할 경우에만 equals()가 리턴
	// 이 코드를 넣어줌으로써 동등객체의 경우 해시코드가 같아 저장된 객체수 
	// 메모리 처리시 해시코드가 중요한 키워드
	//이게 없다면 HashCode 클래스에서 다 다른 객체로 인식하여 저장된 객체 수는 총 3개고 해시코드도 각각 다름 
	@Override
	public int hashCode()
	{
		int hashCode = no + name.hashCode(); //내 마음대로 해시코드 재설정
		return hashCode;
	}
	
	public int getNo(){
		return no;
	}
	public String getName(){
		return name;
	}

	@Override
	public boolean equals(Object obj)
	{
		if(obj instanceof Student target) { //obj Member타입인지 검사하고 타입 변환 후 target 변수 대입
			if(no==target.getNo()&&name.equals(target.getName()))
			return true;
		}
		return false;
	}
}
import java.util.HashSet;

public class HashCodeEx
{

	public static void main(String[] args)
	{
		HashSet hashset = new HashSet(); //저장하는 객체
		Student s1 = new Student(1, ".김멀티");
		hashset.add(s1);
		System.out.println("저장된 객체 수 : " +hashset.size());
		
		// s1 = s2는 같은 객체라 저장이 두 번 되지 않음
		Student s2 = new Student(1, ".김멀티");
		hashset.add(s2);
		System.out.println("저장된 객체 수 : " +hashset.size());
		
		Student s3 = new Student(2, ".이강수");
		hashset.add(s3);
		System.out.println("저장된 객체 수 : " +hashset.size());
		
		
		if(s1.hashCode()==s2.hashCode()) { //해시코드를 비교
			if(s1.equals(s2)) {
				System.out.println("학생번호와 이름이 같으므로 동등객체");
				System.out.println(s1.hashCode()+"         "+s2.hashCode());
				System.out.println(s1.toString()+"        "+s2.toString());
			}
			else {
				System.out.println("학생번호와 이름이 다르므로 동등객체 아님");
				System.out.println(s1.hashCode()+"         "+s2.hashCode());
			}
		}
		else{
			System.out.println("해시코드가 다르므로 동등객체 아님");
			System.out.println(s1.hashCode()+"         "+s2.hashCode());
		}

	}

}

객체 문자 정보

public String toString()
  • 객체를 문자열로 표현한 값
  • Object의 toString() 메소드는 객체의 문자정보를 리턴
  • 기본적으로 Object의 toString() 메소드는 ‘클래스명@16진수’로 구성된 문자열 리턴
Object obj = new Object();
System.out.println(obj.toString());
  • 재정의 가능
@Override
	public String toString() {
		return "학생번호"+no+"학생이름은 "+name;
	}

******************************************************실행클래스 ========******************************************************
if(s1.hashCode()==s2.hashCode()) { //해시코드를 비교
			if(s1.equals(s2)) {
				System.out.println("학생번호와 이름이 같으므로 동등객체");
				System.out.println(s1.hashCode()+"         "+s2.hashCode());
				System.out.println(s1.toString()+"        "+s2.toString());
			}
			else {
				System.out.println("학생번호와 이름이 다르므로 동등객체 아님");
				System.out.println(s1.hashCode()+"         "+s2.hashCode());
			}
		}
		else{
			System.out.println("해시코드가 다르므로 동등객체 아님");
			System.out.println(s1.hashCode()+"         "+s2.hashCode());
		}

	}

3. System 클래스

System 클래스

  • System 클래스의 정적 static 필드와 메소드를 이용하면 프로그램 종료, 키보드 입력, 콘솔, 출력, 현재시간 읽기, 시스템 프로퍼티 읽기 등 가능

err예제

  • out 필드를 이용하면 원하는 문자열 출력 가능하다.
public class ErrEx
{

	public static void main(String[] args)
	{
		// out 필드 이용하면 콘솔에 원하는 문자열 출력 가능
		try {
			int value = Integer.parseInt("1oo");
		}
		catch(NumberFormatException e) {
			System.err.println("에러내용");
			System.err.println(e.getMessage());
		}

	}

}

키보드 입력 기능 예제

  • 키보드 입력 기능 : 자바는 키보드로부터 입력된 키를 읽기 위해 System 클래스에서 in 필드 제공
int keyCode = System.in.read(); 
  • asicII :'0' => 48 'A' => 65 'a' =>97
import java.io.IOException;

public class ErrEx
{

	public static void main(String[] args) 
	{
	
		int speed = 0;
		int keyCode = 0;
		
		while(true) {
			//Enter키를 읽지 않았을 경우에만 실행
			if(keyCode !=13 && keyCode !=10) {
				if(keyCode==49) speed++;
				
				else if(keyCode==50) speed--;
				
				else if(keyCode==51) break;
				
				System.out.println("1. 속도증가 2. 감속 3. 중지");
				System.out.println("-----------------");
				System.out.println("현재 속도"+speed);
				System.out.println("번호를 선택하세요1");
			}
			
			try {
				 keyCode = System.in.read();
				}
				catch(IOException e) {
					System.out.println(e.getMessage());
				}
		}
		
		System.out.println("프로그램 종료");
		System.exit(0); //프로세스 강제 종료 // 0 정상종료 //-1 , 1 비정상종료
	}

}

4. 문자열 클래스

String 클래스

  • 문자열을 저장하고 조작시 사용
  • 문자열 리터럴은 자동으로 String 객체로 생성. String 클래스의 다양핚 생성자를 이용해서 직접
    객체를 생성할 수도 있음

예제

  • StringBulider(내부 버퍼(데이터 저장 하는 메모리))에 문자열을 저장해 두고 그 안에서 추가, 수정 삭제 작업 가능하도록 함
  • 문자열 리터럴은 자동으로 String 객체로 생성되지만, String클래스의 다양한 생성자를 이용하여 직접 객체 생성 가능
import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class ByteToStringEx
{

	public static void main(String[] args) throws Exception
	{
		// String 클래스는 문자열을 저장하고 조작할 때 사용하는 클래스
		// 문자열 리터럴은 자동으로 String 객체로 생성되지만, String클래스의 다양한 생성자를 이용하여 직접 객체 생성 가능
		
		String data = "자바";
		//String ==> byte배열 (기본: UTF-8 인코딩) 
		
		byte[] arr1 = data.getBytes();   //=  byte[] arr1 = data.getBytes("UTF-8");
	    System.out.println("arr1 :" + Arrays.toString(arr1));
	    
	    //byte배열을 => String(기본: UTF-8 디코딩  : 한글 1글자당 3byte)
	    String str1 = new String(arr1);
	    System.out.println("str1 :" + str1);
	   
	    data = "자바프로그래밍";
	  //String ==> byte배열 (기본: EUC-KR 인코딩 : 한글 1글자당 2byte)  => 지정안해주면 다시 되돌릴 때 깨짐
	    byte[] arr2 = data.getBytes("EUC-KR");
	    System.out.println("arr2 :" + Arrays.toString(arr2));
	    
	    String str2 = new String(arr2,"EUC-KR");  //String 클래스는 다양한 생성자를 제공하고 있어 원하는 문자열처리 가능 
	    System.out.println("str2 :" + str2);
		
		
		String data1 ="ABC";
		data1 += "DEF";  //String 내부 문자열을 수정 할 수 없다. 그런데, + 원래 문자열이 아닌 "ABC" + "DEF" => "ABCDEF"
		
		//StringBulider(내부 버퍼(데이터 저장 하는 메모리))에 문자열을 저장해 두고 그 안에서 추가, 수정 삭제 작업 가능하도록 함
		
		String data2  = new StringBuilder().append("DEF").insert(0, "ABC").delete(3, 4).toString();
		System.out.println(data2);
		
	}

}

5. 포장 클래스

포장 객체

  • 기본 타입의 값을 갖는 객체
  • 포장하고 있는 기본 타입의 값 변경 불가하고, 단지 객체로 생성하는 목적

박싱과 언박싱

  • 박싱 : 기본 타입 값을 포장 객체로 만드는 과정. 포장 클래스 변수에 기본 타입 값이 대입 시 발생
  • 언박싱 : 포장 객체에서 기본 타입 값을 얻어내는 과정. 기본 타입 변수에 포장 객체가 대입 시 발생
Integer obj = 100; //박싱
int value = obj; //언박싱
int value = obj + 50; //언박싱 후 연산

문자열을 기본 타입 값으로 변환

  • 포장 클래스는 문자열을 기본 타입 값으로 변환 때도 사용.
  • 대부분의 포장 클래스에는 ‘parse+기본타입’ 명으로 되어 있는 정적 메소드 있음
public class BoxUnBoxingEx
{

	public static void main(String[] args)
	{
		// 숫자 100을 Integer 클래스로 포장하세요.
		Integer obj = 100;
		System.out.println("value: "+obj.intValue());
		
		Float obj1 = 1.5f;
		System.out.println("value: "+obj.floatValue());
		
		//Unboxing
		int value = obj;
		System.out.println(value);
		
		// 연산지 UnBoxing
		value = obj + 100;
		
		System.out.println(value);
		
		Character ch1 = 'A';
		char ch2 = ch1;
		System.out.println(ch1.charValue()+"   "+ch2);
		
		//문자열을 기본값으로 변환하는 코드
		//~128~127 초과일 경우
		
		Integer ob1 = 300;
		Integer ob2 = 300;
		//System.out.println("==:"+(ob1==ob2));
		System.out.println("equals() : "+(ob1.equals(ob2)));
		
		//-128~127 범위의 값일 경우
		Integer ob3 = 100;
		Integer ob4 = 100;
		//System.out.println("== : "+(ob3==ob4));
		// 포장값 비교시 내부값 비교 후 재정의 하는 것이 좋음
		System.out.println("equals() : "+(ob3.equals(ob4)));
	}

}

6. 수학 클래스

public class MathEx
{
	public static void main(String[] args) {
		//근 정수 또는 작은 정수 값 얻기
		double d1 = Math.ceil(5.3);
		double d2 = Math.floor(5.3);
		
		long v3 = Math.max(3, 4);
		long v4 = Math.min(3, 7);
		
		double value = 12.3456;
		double tmp1 = value * 100;
		long tmp2 = Math.round(tmp1);
		
		System.out.println(d1+" "+ d2+" "+v3+" "+ v4+ " "+value +" "+ tmp1+"  "+tmp2);
	}
}

랜덤함수

import java.util.Arrays;
import java.util.Random;

public class RandomEx
{
	public static void main(String[] args) {
		//선택번호 6개가 저장될 배열 생성
		int[] selectNumber = new int[6];
		Random random = new Random(3); //선택번호를 얻기 위해 Random 객체 생성
		
		System.out.println("선택번호: ");
		
		// 선택번호 6개를 얻어 selectNumber 배열에 저장 for 문
		for(int i=1; i<selectNumber.length; i++) {
			selectNumber[i] = random.nextInt(45)+1;
			System.out.println(selectNumber[i]+" ");
		}
		
		System.out.println("==================");
		
		int[] winningNumber = new int[6];
		random = new Random(5);
		System.out.println("당첨번호 : ");
		
		// 당첨번호 6개를 얻어 winneringNumber 배열에 저장 for문을 작성해 보세요!
		for(int i=1; i<winningNumber.length; i++) {
			winningNumber[i] = random.nextInt(45)+1;
			System.out.println(winningNumber[i]+" ");
		}
		
		System.out.println("=======================");
		
		// 당첨여부 확인
		Arrays.sort(selectNumber);
		Arrays.sort(winningNumber);
		
		boolean result = Arrays.equals(selectNumber, winningNumber);
		System.out.println("당첨여부");
		if(result) {
			System.out.println("로또 1등 당첨!!!");
		}
		else {
			System.out.println("다음 기회");
		}
	}
}

7. 날짜와 시간 클래스

Calendar 클래스

  • getInstance() 메소드로 컴퓨터에 설정된 시대 기준으로 Calendar 하위 객체를 얻을 수 있음
  • 달력을 표현하는 추상 클래스

Date 클래스

  • Date() 생성자는 컴퓨터의 현재 날짜를 읽어 Date 객체로 만듦
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DataEx
{

public static void main(String[] args)
{
Date now = new Date();
String str1 = now.toString();
System.out.println(str1);
//System.out.println(now.getHours()); => 너무 오래돼서 쓰지마라

SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
String str2 = sdf.format(now);
System.out.println(str2);

//달력을 표현하는 추상클래스 Calendar : 자식클래스에서 구현하도록
Calendar now1 = Calendar.getInstance();

int year = now1.get(Calendar.YEAR);
int month = now1.get(Calendar.MONTH)+1; //0부터 시작이라 +1
int day = now1.get(Calendar.DAY_OF_MONTH);
System.out.println(year+"."+month+"."+day);

}


}

8. 정규 표현식 클래스

  • 문자열이 정해져 있는 형식으로 구성되어 있는지 검증해야 하는 경우 사용
    • ex. 문자숫자@daum.net, 전화번호(010 선택 0000-0000) : 숫자나 문자의 범위 지정
    • Regular Expression(정규 표현식)을 이용하여 문자열이 올바르게 구성되었는지 검증
  • 02-123-1234 / 010-1234-7898 전화번호를 위한 정규표현식
    • (02|032|033|010)-\d{3, 4}-\d{4} ⇒ \d{3, 4} 3글자이거나 4글자여야 함
  • 이메일을 위한 정규 표현식 white@naver.com
    • \\w+@\\w+\\.\\w+(\\.\\w+)?.모든 문자 중에서 한개의 문자를 의미. \w. 문자

Pattern 클래스로 검증

  • java.util.regex 패키지의 Pattern 클래스는 정규 표현식으로 문자열을 검증하는 matches() 메소드 제공
boolean result = Pattern.matches("정규식", "검증할 문자열");
import java.util.regex.Pattern;

public class PatternEx
{

	public static void main(String[] args)
	{
		String regExp = "(02|032|033|010)-\\d{3,4}-\\d{4}";
        String data = "010-1234-5678";
        boolean result = Pattern.matches(regExp, data);
        if(result) System.out.println("정규식과 일치합니다. 데이터베이스 저장에 적합한 문자열입니다.");
        else System.out.println("정규식에 불일치합니다. 데이터를 다시 입력해 주세요");
        
        regExp = "\\w+@\\w+\\.\\w+(\\.\\w+)?";
        data = "white@daum.net";   //유효성 검증 
        
        result = Pattern.matches(regExp, data);
        if(result) System.out.println("정규식과 일치합니다. 데이터베이스 저장에 적합한 문자열입니다.");
        else System.out.println("정규식에 불일치합니다. 데이터를 다시 입력해 주세요");
        
	}

}

자주 사용하는 참고 표현식

참고!!

  1. 숫자만 : ^[0-9]*$
  2. 영문자만 : ^[a-zA-Z]*$
  3. 한글만 : ^[가-힣]*$
  4. 영어 & 숫자만 : ^[a-zA-Z0-9]*$
  5. E-Mail : ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$
  6. 휴대폰 : ^01(?:0|1|[6-9]) - (?:\d{3}|\d{4}) - \d{4}$
  7. 일반전화 : ^\d{2.3} - \d{3,4} - \d{4}$
  8. 주민등록번호 : \d{6} - [1-4]\d{6}
  9. IP 주소 : ([0-9]{1,3}) . ([0-9]{1,3}) . ([0-9]{1,3}) . ([0-9]{1,3})
💡 **자주 사용하는 표현식의 의미**
  1. ^ : 문자열의 시작
  2. $ : 문자열의 종료
  3. . : 임의의 한 문자 (문자의 종류와 관계없음)
  4. | : or의 의미임
  5. ? : 앞 문자가 없거나 하나 있을때
  6. : 앞 문자가 하나 이상임 (최소 한개 이상)
  7. : 앞 문자가 없을 수도 있고, 무한정 많을 수도 있음
  8. [] : 문자 클래스의 지정, 문자의 집합이나 범위를 나태내면 - 기호를 사용한다. [] 내에서 ^를 사용하면 not의 의미임
  9. {} : 횟수나 범위를 나타냄. 예를 들어 k{5}의 경우 k가 5번 반복되는 경우임, a{3,5}는 a가 3번 이상 5번 이하 반복되는 경우임
  10. \w : 알파벳이나 숫자
  11. \W : \w의 not. 즉 알파벳이나 숫자를 제외한 문자
  12. \d : [0-9]와 동일
  13. \D : 숫자를 제외한 모든 문자

자바에서 API 제공 ⇒ java.util.regex.Pattern

  • 정규표현식으로 문자열을 검증하는 matches() 메소드 제공
  • boolean result = Pattern.matches(”정규식”, “검증할 문자열”);

이미지 경로에 문자가 생길 시 판단할 수 있는 방법

절대 경로 vs 상대경로

  • CDN를 사용, 웹에 올려진 미디어 등을 접근
  • 절대경로
    • 대표적인 방법 /
    • /은 포트 다음의 폴더 경로를 의미
    • 만약 Path에 프로젝트명이 존재할 경우 /의 기능이 상실
  • 상대경로
    • 상대적 위치
    • move를 이용하면 옮길 수 있음
    • move txt 파일 옮기고 싶은 상대 경로

회고

자바는 쉬운것 같으면서 너무 복잡하다ㅠ 인터페이스부터는 배웠던 거라도 실제로는 어떻게 쓰이는 지에 대한 것은 대학에서 안배워서 그런지 인터페이스 이후부터는 뭔가 더 지식이 확고 해지는 기분이다. 따로 공부를 더 해야 확고 해질 테니 더 열심히 하자

profile
내 지식을 기록하여, 다른 사람들과 공유하여 함께 발전하는 사람이 되고 싶다. gitbook에도 정리중 ~

0개의 댓글