Java 기초

Java 기초 (5. Hashcode 와 생성자 함수)

Kw_w 2024. 3. 13. 20:59
 “더 이상 상황을 바꿀 수 없을 때 우리는 스스로를 변화시켜야 합니다.”
– 빅터 프랭클

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?

  1. 자신의 속성값을 초기화 할 때
  2. 객체 생성 후 바로 어떤 처리가 필요할 때

-> 우리가 별도로 생성자 함수를 구현하지 않아도 자동으로 컴파일러가 붙여준다.

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