잘 이해안됨.. 계속 봐보기
eaquals, hashcode 오버라이딩
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;
}
}
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());
}
}


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;
}
}
464p
finalclass->상속불가능한 클래스
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("==================================");
}
}

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));
}
}
}

원본바뀌지않음
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);//원본출력
}
}

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);
}
}


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;
}
}

482p
원본변경 x : string
원본변경 o (리소스줄임):
stringbuffer
stringbuilder ->웹환경에서 더 가벼움
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("==================");
}
}

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);
}
}

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)의 교육을 수강하고 작성되었습니다.