JAVA.

brave_chicken·2024년 3월 27일

잇(IT)생 챌린지

목록 보기
13/90

ObjectsTest/ Objects클래스의 기본 기능

잘 이해안됨.. 계속 봐보기
eaquals, hashcode 오버라이딩

  • equals를 오버라이딩 하는 있는 객체가 갖고있는 값들을 비교하기 위해서 오버라이딩
  • null,객체의 속성, 클래스타입, obj와 this가 같은 객체인지 비교
  1. this와 obj가 같은 객체인지 비교
  2. obj가 null이 아니고 동일한 클래스인지 비교
  3. 객체가 갖고 있는 속성을 비교
  • equals메소드를 이용해서 같은 객체로 판단이 되면 무조건 두 객체에 hashcode가 같아야 한다.
  • HashMap,HashSet과 같은 컬렉션 객체는 해시코드를 가지고 비교
  • 같은 객체인데 해시코드가 다르면 컬렉션 내부에서 처리가 제대로 되지 않는 경우가 발생
package api.lang;

import java.util.Objects;

public class ObjectsTest {
	public static void main(String[] args) {
		Person p1 = new Person("BTS","서울",901112);
		Person p2 = new Person("BTS","서울",901112);
		System.out.println(Objects.equals(p1, p2));
//		객체의 속성들을 이용해서 hashcode를 생성
		System.out.println(Objects.hash(p1.getAddr(),p1.getName(),p1.getAge()));
		System.out.println(Objects.hash(p2.getAddr(),p2.getName(),p2.getAge()));
	}

}

package api.lang;

import java.util.Objects;

public class Person {
	private String name;
	private String addr;
	private int age;
	public Person() {
		
	}
	public Person(String name, String addr, int age) {
		super();
		this.name = name;
		this.addr = addr;
		this.age = age;
	}
//	public String toString() {
//		return "name:"+name+",addr:"+addr+",age"+age;
//	}
	

	
//여기부터 보기
	
	//equals를 오버라이딩 하는 있는 객체가 갖고있는 값들을 비교하기 위해서 오버라이딩
	//null,객체의 속성, 클래스타입, obj와 this가 같은 객체인지 비교
//	1. this와 obj가 같은 객체인지 비교
//	2. obj가 null이 아니고 동일한 클래스인지 비교
//	3. 객체가 갖고 있는 속성을 비교
	public boolean equals(Object obj) { //Object가 가진 equals를 오버라이딩
		//객체의 멤버변수들을 비교 - this와 매개변수 obj의 속성을 비교
		if(this==obj) return true;
		if(obj==null || this.getClass()!=obj.getClass()) return false;
        
		//객체의 멤버변수를 비교, name,age,addr
		//객체의 멤버변수를 비교하기 위해서 캐스팅(형변환)
		if(obj instanceof Person) {
			Person p =(Person)obj;
			//객체가 갖고 있는 모든 값을 비교
			if(this.name.equals(p.getName()) & this.addr.equals(p.getAddr()) & this.age == p.getAge()) {
				return true;
			}
		}
		return false;
	}
	
	//equals메소드를 이용해서 같은 객체로 판단이 되면 무조건 두 객체에 hashcode가 같아야 한다.
	//HashMap,HashSet과 같은 컬렉션 객체는 해시코드를 가지고 비교
	//같은 객체인데 해시코드가 다르면 컬렉션 내부에서 처리가 제대로 되지 않는 경우가 발생
	public int hashCode() {
//		Person객체가 갖고있는 모든 필드값을 전달받아서 해시코드를 생성
//		각 매개변수의 hashcode를 구해서 종합
		return Objects.hash(addr,age,name);
	}
	
	
	
	//여기까지
	
	
	
	public String getName() {
		return name;
	}
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", addr=" + addr + ", age=" + age + "]";
	}
	//source-제너레이트 투스트링
	
	public void setName(String name) {
		this.name = name;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

ObjectTest2

equals메소드와 hashcode메소드

  • toString(),equals. hashcode 항상 오버라이딩 해야함
  • 메모리비교->hash코드 비교-JDK내부 API
  • equals비교하려 해도 내부에선 hash코드로 비교해서 주소비교
    =>equals오버라이딩+hashcode오버라이딩
    453p
package api.lang;

import java.util.HashSet;
import java.util.Random;

//equals메소드와 hashcode메소드
public class ObjectTest2 {
	public static void main(String[] args) {
		Person p1 = new Person("BTS","서울",901112);
		Person p2 = new Person("BTS","서울",901112);
		//p1과 p2의 객체는 값이 같은 동일한 객체
		//Object클래스의 equals를 사용하지 않고 Person에서 오버라이딩한 메소드가 호출되어 
		//객체의 속성을 비교해서 같은 객체인지 다른객체인지 리턴
		
		if(p1.equals(p2)) {
			System.out.println("같다.");
		}else {
			System.out.println("다르다.");
		}
		System.out.println(p1);
		System.out.println(p2);
        
        
		//hashcode는 java에서 객체의 해시코드값을 반환하는 메소드
		//해시코드는 객체를 식별할 때 사용하는 정수값 -객체가 할당된 메모리 주소를 기반으로 계산된 값
		//자료구조에서 객체를 빠르게 찾기 위해서 사용
		System.out.println(p1.hashCode());
		System.out.println(p2.hashCode());
		
		HashSet<Person> set = new HashSet<>();
		set.add(p1);
		set.add(p2);
		System.out.println(set.size());
		//해시코드가 다르니까 다르게 나타남
		
		//getClass메소드
//		class가 같아도 패키지가 다르면 다른객체임
		System.out.println(p1.getClass());
		System.out.println(p2.getClass());
	}

}

VehicleTest-Owner,Vehicle

package api.lang;

import java.util.Objects;

public class VehicleTest {
	public static void main(String[] args) {
		Vehicle vehicle1= new Vehicle();
		Owner owner1= new Owner("LEE", "010-2233-4455");
		vehicle1.setOwner(owner1);
		vehicle1.setPrice(25000000);
		System.out.println(vehicle1);
		Vehicle vehicle2= new Vehicle();
		Owner owner2= new Owner("LEE", "010-6677-8899");
		vehicle2.setOwner(owner2);
		vehicle2.setPrice(50000000);
		System.out.println(vehicle2);
		System.out.println(Objects.equals("LEE", "LEE"));
		System.out.println(Objects.equals(owner1, owner2));
		//매개변수로 전달된 객체의 equals를 호출해서 비교.. 오버라이딩은 무조건해야함. 간단버전없엉
		System.out.println("동일한 소유주 여부 : "+ vehicle1.equals(vehicle2));
		
//		System.out.println("동일한 소유주 여부 : "+Objects.equals(owner1,owner2));
	}
}

package api.lang;

import java.util.Objects;

public class Owner {
	private String name;//변수는 프라이빗으로 은닉시키자 = 캡슐화= 인포메이션 하이딩
	private String cellPhone;
	
	
	public String toString() {
		return "소유주정보 : 이름은 "+name+"이고, 핸드폰 번호는"+cellPhone+"입니다.\n";
	}
	
	@Override
	public int hashCode() {
		return Objects.hash(name);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		if(obj instanceof Owner) {
			Owner owner = (Owner) obj;
			//객체가 갖고있는 모든 값을 비교
			if(this.name.equals(owner.getName())) {
				return true;
			}
		}
		return false;
	}
		
	
	public Owner() {}
	public Owner(String name, String cellPhone) {
		super();
		this.name = name;
		this.cellPhone = cellPhone;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getCellPhone() {
		return cellPhone;
	}
	public void setCellPhone(String cellPhone) {
		this.cellPhone = cellPhone;
	}
	
}
package api.lang;

import java.util.Objects;

public class Vehicle {
	private Owner owner;
	private int price;
	
	public String toString() {
		return owner+"차량정보 : 가격은 "+price+"입니다.";
	}
	
//	public boolean equals(Object obj) {
//		
//		if(obj instanceof Vehicle) {
//			Vehicle v = (Vehicle)obj;
//			if(this.owner.equals(v.getOwner())) {
//				return true;
//			}
//		}
//		return false;
//	}
	

	@Override
	public int hashCode() {
		return Objects.hash(owner, price);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		if(obj instanceof Vehicle) {
			Vehicle v = (Vehicle) obj;
			//객체가 갖고있는 모든 값을 비교
			if(this.owner.equals(v.getOwner())) {
				return true;
			}
		}
		return false;
	}

	public Vehicle() {}
	public Owner getOwner() {
		return owner;
	}
	public void setOwner(Owner owner) {
		this.owner = owner;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
}

StringTest01/ String객체의 비교

464p
finalclass->상속불가능한 클래스

String객체의 비교

  • 리터럴로 생성
  • new연산자를 이용해서 생성
public class StringTest01 {
	public static void main(String[] args) {
		String str = new String("java");
		String str2 = new String("java");
		String str3 = "java";
		String str4 = "java";
//		System.out.println(str.toUpperCase());//소문자를 대문자로 변경
		if(str==str2) {
			System.out.println("같다.");
		}else {
			System.out.println("다르다.");
		}//주소가 달라서 다르다라고 뜸
		System.out.println("==================================");
		
		if(str3==str4) {
			System.out.println("같다.");
		}else {
			System.out.println("다르다.");
		}//상수풀에 들어가서 같다고 뜸
		System.out.println("==================================");
		
		if(str==str4) {
			System.out.println("같다.");
		}else {
			System.out.println("다르다.");
		}//상수풀과 달리 관리가됨 ..
		System.out.println("==================================");
		
	}
}

StringTest02/ String 클래스의 중요한 메소드를 살펴보기 -1

468p
원본이 바뀌지 않음

public class StringTest02 {
	public static void main(String[] args) {
		String str1 = new String("java programming");
		String str2 = "재밌다";
		System.out.println("str1.charAt(1)=>"+str1.charAt(1)); //0부터 시작, 두번째글자 a
		System.out.println("str1.concat(str2)=>"+str1.concat(str2));//str1하고 str2연결하는겨
		System.out.println("str1.indexOf('a')=>"+str1.indexOf('a'));//a가 0부터시작해서 1번에 있음
		System.out.println("str1.indexOf(\"합\")=>"+str1.indexOf("합"));//'합'글자가 없으니 -1리턴( 없으면 -1 리턴)
		System.out.println("str1.lastIndexOf('a')=>"+str1.lastIndexOf('a'));//뒤에서부터 찾음 뒤에서부터 a
		System.out.println("str1.lastIndexOf(\"합\")=>"+str1.lastIndexOf("합"));
		
		System.out.println("str1.length()=>"+str1.length());
		
		System.out.println("str1.equals(\"java programming\")=>"+str1.equals("java programming"));
		System.out.println("str1.equals(\"Java programming\")=>"+str1.equals("Java programming"));
		System.out.println("str1.equalsIgnoreCase(\"java programming\")=>"
							+str1.equalsIgnoreCase("java programming"));
		System.out.println("str1.equalsIgnoreCase(\"Java programming\")=>"
							+str1.equalsIgnoreCase("Java programming"));
		
		System.out.println("원본==>"+str1);
		//대소문자를 변환
		System.out.println("str1.toUpperCase()=>"+str1.toUpperCase());//전부 대문자로 바꾸ㅝ출력
		System.out.println("str1.toLowerCase()=>"+str1.toLowerCase());//전부 소문자로 바꿔ㅜ 출력
		System.out.println("원본==>"+str1);

미션

ex. java를 args[0]로 입력받으면 AVAJ로 출력하기
힌트 - 한문자씩 제어하기 위해서 for문과 같이 사용

String data = args[0].toUpperCase();
//입력 prompt만듦
//대문자로 변환

//5버전부터 스캐너를 만들어서 사용. 그전엔 명령프롬프트
//args배열은 결국 여기 파일내부가 아니라 외부에서 입력되는(?) 값. 프롬프트나 스캐너 등으로
		
      System.out.println(data);
		
		int size = data.length();
		
		for(int i=0;i<size;i++) {
			System.out.print(data.charAt(i));
		}
		
		System.out.println("===================");
		for(int i=size-1;i>=0;i--) {//여기 왜 -1하는거지?
			System.out.print(data.charAt(i));
		}
		
	}

}

StringTest03/ String 클래스의 중요한 메소드를 살펴보기 -2(검색과 추출)

원본바뀌지않음

public class StringTest03 {
	public static void main(String[] args) {
		String str1 = new String("java programming");
		String str2 = "재밌다";

		System.out.println("str1.startsWith(\"java\")"+str1.startsWith("java"));//이걸로 시작하니
		System.out.println("str1.startsWith(\"test\")"+str1.startsWith("test"));
		System.out.println("str1.endsWith(\"ing\")"+str1.endsWith("ing"));//이걸로 끝나니
		System.out.println("str1.endsWith(\"java\")"+str1.endsWith("java"));
		System.out.println("str1.contains(\"ja\")"+str1.contains("ja"));//이거 포함되니
		System.out.println("str1.contains(\" \")"+str1.contains(" "));//공백도 있지
		
		System.out.println("str1.substring(5)"+str1.substring(5));//공백포함 5부터 추출,0으로 시작
		System.out.println("str1.substring(5,8)"+str1.substring(5,8));//begin~end-1
		System.out.println("str1.replace('a','A')"+str1.replace('a','A'));//얘를 얘로 바꿔
		System.out.println(str1);//원본출력
	}

}

tringTest04/ String 클래스의 중요한 메소드를 살펴보기 -3

String 클래스의 메소드를 이용한 데이터 변환

public class StringTest04 {
	public static void main(String[] args) {
		String str1 = new String("java programming");
		String str2 = new String("java ,oracle ,html5 css javascript jquery");
		System.out.println(str2.replace(" ", ""));//공백없애기
		//1. String -> byte[]..네트워크 전송할때 패킷단위로 전송할때 필요
		byte[] data1 = str1.getBytes();//문자열의 문자 하나를 ASCII로 변환해서 byte[]에 저장해서 리턴
		for(byte b:data1) {
			System.out.println(b);
		}
		//2. String -> char[]
		char[] data2 = str1.toCharArray();//문자열을 char[]로 저장해서 리턴
		for(char val:data2) {
			System.out.println(val);
		}
		//3. String -> String[]
		String[] data3 = str2.split(" ,");//문자열을 특정 기호로 잘라서 String[]로 리턴
		for(String str:data3) {
			System.out.println(str);
		}
		//4. 기본형 -> String
		int i = 1000;
		double d = 10.5;
		test(String.valueOf(i));//
		test(String.valueOf(d));
		test(i+"");//문자열이 있으면 문자열화함.+로 문자열연결해서 문자열화하면 가능(string변수이니)
		test(d+"");
		
	}
	public static void test(String data) {
		System.out.println("전달받은데이터=>"+data);
	}
}

Prob1 /exam

package api.lang;

public class Prob1 {
	public static void main(String[] args) {
		System.out.println("문자열에 특정문자 변경하는 테스");
		System.out.println("-------------Sample 1 --------------");
		String str1=myReplace("hello world",'l','*');
		System.out.println(str1);
		
		System.out.println("-------------Sample 2 --------------");
		String str2=myReplace("hello world",' ','-');
		System.out.println(str2);
		
		System.out.println("-------------Sample 3 --------------");
		String str3=myReplace("hello world",'a','*');
		System.out.println(str3);
		

	}
	public static String myReplace(String str, char oldChar, char newChar){
		//이부분구현, 
		//힌트 문자열을 하나씩 추출해서 새로운 문자열로 구성
		
		String result ="";
		int size = str.length();
		for(int i=0;i<size;i++) {
			if(str.charAt(i)==oldChar) {
				result = result+newChar;
			}else {
				result = result+str.charAt(i);
			}
		}
		return result;
	}
	
}

StringBufferTest

482p
원본변경 x : string
원본변경 o (리소스줄임):
stringbuffer
stringbuilder ->웹환경에서 더 가벼움

  • String은 원본이 변경되지 않고 String메소드의 호출결과가 새로운 String객체로 만들어져서 리턴된다.
  • ""(리터럴)의 형태로 문자열을 사용하더라도 각각의 String객체로 생성된다.
  • 문자열조작이 자주발생하는 작업은 StringBuffer나 StringBuilder를 이용해서 작업한다.
  • StringBuffer나 StringBuilder는 원본 문자열이 변경된다.(stirngtest02처럼 읽기전용이 아님!)
package api.lang;

public class StringBufferTest {

	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("java programming");
		StringBuilder sbuilder = new StringBuilder("java programming");
		
		System.out.println("원본=>"+sb);
		System.out.println("원본=>"+sbuilder);
		System.out.println("==================");
        
//		문자열 뒤에 문자열을 추가하기
		sb.append("재밌다.");
		sbuilder.append("재밌다.");
		System.out.println("원본=>"+sb);
		System.out.println("원본=>"+sbuilder);//원본이 바뀐걸 볼 수 있음
		System.out.println("==================");
		
		//문자열 중간에 삽입
		sb.insert(2, "=survlet=");
		sbuilder.insert(5, "+++test++++");
		System.out.println("원본=>"+sb);
		System.out.println("원본=>"+sbuilder);
		System.out.println("==================");
		
		//문자열삭제
		sb.delete(2, 5);
		sbuilder.delete(2, 5);
		System.out.println("원본=>"+sb);
		System.out.println("원본=>"+sbuilder);
		System.out.println("==================");
		
		//문자열 거꾸로 출력하기
		sb.reverse();
		sbuilder.reverse();
		System.out.println("원본=>"+sb);
		System.out.println("원본=>"+sbuilder);
		System.out.println("==================");
		
	}

}

StringStringBufferTest / String과 StringBuffer의 성능 비교

public class StringStringBufferTest {
	//String으로 객체를 만들고 문자열을 추가해서 실행시간을 측정
	public static void stringCheck (int count) {
		long start = System.nanoTime();//작업실행전에 시간을 측정
		String str = new String("java");
		for(int i=0;i<=count;i++) {
			str = str+"java";//for문이 실행되는 동안 str에 java문자열을 append
			
			//str = str + new String("java");
		}
		long end = System.nanoTime();//작업이 종료되는 시간 측정
		System.out.println("str = str + java");
		System.out.println("실행시간: "+(end-start));
	}
	//StringBuffer로 객체를 만들고 문자열을 추가해서 실행시간을 측정
	public static void stringBufferCheck (int count) {
		long start = System.nanoTime();//작업실행전에 시간을 측정
		StringBuffer str = new StringBuffer("java");
		for(int i=0;i<=count;i++) {
			str.append("java");//for문이 실행되는 동안 str에 java문자열을 append
		}
		long end = System.nanoTime();//작업이 종료되는 시간 측정
		System.out.println("str.append('java')");
		System.out.println("실행시간: "+(end-start));
	}
	//StringBuilder로 객체를 만들고 문자열을 추가해서 실행시간을 측정
		public static void stringBuilderCheck (int count) {
			long start = System.nanoTime();//작업실행전에 시간을 측정
			StringBuilder str = new StringBuilder("java");
			for(int i=0;i<=count;i++) {
				str.append("java");//for문이 실행되는 동안 str에 java문자열을 append
			}
			long end = System.nanoTime();//작업이 종료되는 시간 측정
			System.out.println("str.append('java')");
			System.out.println("실행시간: "+(end-start));
		}
	public static void main(String[] args) {
		int count = 10000;
		stringCheck(count);
		System.out.println("=============================");
		stringBufferCheck(count);
		System.out.println("=============================");
		stringBuilderCheck(count);
		
	}

}

SystemTest

package api.lang;

public class SystemTest {
	public static void main(String[] args) {
		//시스템(OS,JVM)정보를 담고 있는 프로퍼티를 추출
		//환경변수
		System.out.println(System.getProperty("os.name"));
		System.out.println(System.getProperty("os.version"));
		System.out.println(System.getProperty("java.vendor"));
		System.out.println(System.getProperty("user.name"));
		System.out.println(System.getProperty("user.dir"));
		System.out.println(System.getProperty("user.home"));
		
		//커런타임밀리스 : 1970/1/1부터 현재시간 사이의 날짜를 millisecond로 반환
		long start = System.currentTimeMillis();//시작시간을 측정//static이라 바로접근가능~~
		for(int i=0;i<=100;i++) {
			System.out.print(i);
		}
		long end = System.currentTimeMillis();//종료시간을 측정
		System.out.println(start);
		System.out.println(end);
		System.out.println("실행시간: "+(end-start));//for문이 돌아간 시간
		
		
		//나노초로 측정해서 반환 -> 1/10억 초
		long start1 = System.nanoTime();//시작시간을 측정//static이라 바로접근가능~~
		for(int i=0;i<=100;i++) {
			System.out.print(i);
		}
		long end1 = System.nanoTime();//종료시간을 측정
		System.out.println(start1);
		System.out.println(end1);
		System.out.println("실행시간: "+(end1-start1));//for문이 돌아간 시간
	}

}

본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.

0개의 댓글