“더 이상 상황을 바꿀 수 없을 때 우리는 스스로를 변화시켜야 합니다.”
– 빅터 프랭클
Hashcode
자바에서는 객체의 주소값을 이용해서 해싱(Hashing) 기법을 통해 코드를 만든 후 변환
hashcode는 주소값이 아니고 주고값을 만든 고유한 숫자값
example
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class Person {
String name;
public void setName(String name){
this.name = name;
}
@Override
public boolean equals(Object obj){
return Objects.equals(this.name,((Person)obj).name);
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\\'' +
'}';
}
}
class Main {
public static void main(String[] args) {
var p1 = new Person();
p1.setName("kavin");
var p2 = new Person();
p2.setName(("kavin"));
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
System.out.println(p1.equals(p2));
//객체를 저장할수 있는 자료구조
//중복된 객체를 저장할 수 없다. 즉 key 가 동일하면 저장이 안됨
Set<Person> personSet = new HashSet<>();
personSet.add(p1);
personSet.add(p2);
for (var p : personSet){
System.out.println(p);
}
}
}
→ java에서 객체를 같다를 정의한다면 hashcode와 equals 메소드를 override를 해야한다.
생성자 함수 (constructor)
생성자란 객체가 생성될 때 동적으로 인스턴스 변수 초기화를 실행
자바에는 반드시 하나 이상의 생성자 함수가 있어야 한다.
why?
- 자신의 속성값을 초기화 할 때
- 객체 생성 후 바로 어떤 처리가 필요할 때
-> 우리가 별도로 생성자 함수를 구현하지 않아도 자동으로 컴파일러가 붙여준다.
(= default constructor) = 기본 생성자
example
public class Car {
String modelName;
String color;
int maxSpeed;
public Car(){
System.out.println("Car() call!");
modelName = "KIA";
color = "BLUE";
}
// 오버로딩된 파람은 Car 에서 중요한 속성이라는 것을 표기하는 것과 동일
public Car(String modelName, String color){
this.modelName = modelName;
this.color = color;
}
}
class Main2 {
public static void main(String[] args) {
// 기본형 생성자 호출
var car = new Car();
System.out.println("main~");
// 생성자 오버로딩
var superCar = new Car("Porche", "yellow");
}
}
this 참조변수는 해당 인스턴스의 주소를 가리키고 있기 때문에 자신에게 접근이 가능
- instance 생성자 블럭
- static 생성자 블럭
- constructor 생성자 블럭
실행순서
static 블럭 > instance 블럭 > 생성자 블럭
public class Good {
int sum;
static int index;
String str;
// instance 블럭
{
index = 1;
for(int i = 0; i<50; i++){
sum += i;
}
System.out.println("instance block");
}
static {
String data = loadConfigData();
index = 9;
System.out.println("Static block");
}
private static String loadConfigData(){
System.out.println("load data....");
return "load data....";
}
public Good(){
str = "hello";
System.out.println("default constructor block");
}
}
class Main3{
public static void main(String[] args) {
var good = new Good();
var good1 = new Good();
var good2= new Good();
System.out.println("constructor block");
System.out.println(good.sum);
}
}
'Java 기초' 카테고리의 다른 글
Java 기초 (4. Overload vs Override) (2) | 2024.03.12 |
---|---|
Java 기초 (연습하기-1) (0) | 2024.03.12 |
Java 기초 (3. Switch문, While문) (0) | 2024.02.29 |
Java 기초 (2. 형변환과 연산자, 조건문) (2) | 2024.02.28 |
Java 기초 (1. 메모리와 데이터 타입) (2) | 2024.02.27 |