Java

Java 기본 Class

jmboy 2024. 4. 4. 17:42

1. java.lang.Object class

  • 상속 관계에 있어 모든 클래스의 최상위 class이다.
  • 2개의 주요한 method 제공
    1. equals()
      • 비교 : 메모리 위치가 같은 것인지, 의미 상 같은 것인지 비교가 다르다.
      • == : 메모리 값 비교
      • equals 를 오버라이딩하지 않으면 메모리 주소 값을 비교한다.
      @Override
          public boolean equals(Object obj) {
              //인자로 들어온 객체 - Object ( 모든 객체가 들어올 수 있다.)
              // 인자로 들어온 인스턴스가 equals method를 가지고 있는 인스턴스의 내용과 같으면 같은 객체로 판별하는 로직
              // 두 인스턴스의 데이터 타입이 같아야 하기 때문에 맞춰주어야 한다.
              Student target = (Student) obj;
      
              if(this.getName() == target.getName()&& this.getAge()== target.getAge()) {
                  return true;
              }
              return false;
      
          }
      
    2. toString()
      • 객체를 문자열로 변환시키는 함수.
      • 객체 ( 메모리공간 ) → 문자열로???
      • 메모리 주소의 해시코드를 찍는다 ( 객체의 시작주소를 찍음)
      @Override
          public String toString() {
              return this.getName() + ":" + this.getAge();
          }
          
      // s1을 출력시 다음과 같은 형태로 출력해줌.
      

2. String class

  • java는 8개의 primitive 데이터 타입을 제공.
  • 문자열은 기본 타입으로 제공되지 않는다. reference type으로 제공. class로 제공됨.
  • 문자열 literal 을 제공한다. ( 표현 방식을 제공함)
String a = new String("문자");
// 너무 불편하다  -> 다음과 같이
String b = "문자열";
String c = "문자열";
String d = new String("문자");

b = "바꾼문자";
  • b처럼 만든다 → heap 에 String pool에 들어감.
  • a처럼 만든다 → heap에 만들어짐.(객체가 올라감) - 다른 객체를 계속해서 만들어냄.
graph LR
  subgraph heap
	  subgraph StringPool
	  z[문자열]
	  abc[바뀐문자]
	  end
	  q[new String-문자]
	  m[new String- 문자]
	  
  end
  
  subgraph stack
  a[b]-->abc
  w[c]-->z
  ab[a]-->q
  ac[d]-->m
  end
  
  
  • 문자열 비교는 equals()를 사용한다. ( StringPool 내의 메모리를 비교)
  • immutable ( 불변의 )
    • 값을 바꾸면 참조하는 값을 바꾼다.

3. Array

  • 배열은 같은 데이터 타입을 여러개 저장할 수 있는 집합형 자료구조
  • 기호는 [] 를 이용. 저장 순서가 존재.Index 개념이 존재한다.
  • 배열은 instance 이고, 특수한 형태로 생성을 한다.
int a = 100;
int [] arr  = new int[6]; 

4. ArrayList class

  • 특수한 interface를 구현하고 있다 → list 인터페이스를 구현하고 있다.
  • 객체면 다 들어올 수 있다.
  • ArrayList객체를 만들어서 사용해 보자.
  • List계열은 객체면 type에 상관없이 다 저장이 가능하다.
  • 다른 reference data type을 저장할 수 있다.
  • 꺼낼 때도 casting 해서 원래 타입으로 바꿔주는 것이 좋다. → 속도가 느리다.
  • 실제 구현하다 보면 같은 데이터 타입을 이용해서 사용하게 됨 - generics
package collections;

import java.util.ArrayList;
import java.util.List;

class MyStudent{
    @Override
    public String toString() {
        return "student";
    }
}

public class ArrayListTest {
    public static void main(String[] args) {
        // ArrayList객체를 만들어서 사용해 보자.
        // List계열은 객체면 type에 상관없이 다 저장이 가능하다.
        // 다른 reference data type을 저장할 수 있다.
        // 실제 구현하다 보면 같은 데이터 타입을 이용해서 사용하게 됨 - generics
        List list = new ArrayList();
        list.add("1번");
        list.add(new MyStudent());
        list.add(100); // int 형태의 primitive type. 원칙적으로 들어갈 수 없다.
        // java에는 primitive type에 각각 대응되는 wrapper 클래스가 존재한다.
        // list.add(100) -> list.add(new Integer(100));
        for (Object o : list) {
            System.out.println(o);
        }
    }
}

/*
1번
student
100
*/
  • boxing 이라는 표현을 사용한다. ( primitive → wrapper )
    • 자동으로 해줌 → auto boxing

5. HashMap class

  • key 와 value로 이루어진 집합형 자료구조.
  • 순서가 없다. key 값으로 value 에 access.
package collections;

import java.util.HashMap;
import java.util.Map;

public class HashMapTest {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        map.put("one", "hyundai");// 저장.
        System.out.println(map.get("one")); // 키값으로 가져오기
        
    }
}


6. HashSet

  • set은 바구니 같은 자료구조
  • 저장되는 순서가 없다. 중복 값이 없다
package collections;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashSetTest {
    public static void main(String[] args) {
        Set<String> setTest = new HashSet<>();
        setTest.add("a");
        setTest.add("a");
        setTest.add("b");
        Iterator<String> iter =  setTest.iterator();
        while (iter.hasNext()) {
            System.out.println(iter.next());
        }
    }
}

  • iterator : 순서의 개념은 없다. 그저 다음이 있는지 파악하는 것.