Java(5)

Jinny·2021년 5월 11일
0

JAVA

목록 보기
4/8
post-thumbnail

Object 클래스 메서드

java에서 ‘==’와 ‘Equals()’의 차이

  • equals
    • 객체끼리 값을 비교할 수 있는 '메소드'
    • Object 클래스에 정의된 원형은 "=="와 같기 때문에 custom class에 대해서는 재정의 해줘야한다.
      • String, Integer 등의 클래스에는 이미 재정의 되어있음
  • ==
    • 객체의 주소값을 비교하는 '연산자'

  • a==b -> true

  • a.equlas(b) -> true

  • a==c -> false

  • a.equals(c) -> true

hashCode()

인스턴스의 힙메모리 저장 주소를 반환하는 메서드이다. (힙메모리에 인스턴스가 저장되는 방식이 hash)

  • hash: 정보를 저장, 검색하기 위해 사용하는 자료구조로, 자료의 특정 값(키 값)에 대해 저장 위치를 반환해주는 해시 함수를 사용한다.

    index = hash(key)
    // index는 저장위치
  • String, Integer 등의 클래스에서는 서로 다른 메모리의 두 인스턴스의 값이 동일하면 hashCode() 값도 동일하게 반환된다.(실제 힙메모리 주소는 다름)

    • 논리적으로 동일함을 위해 equals() 메서드를 재정의 하였다면 hashCode() 메서드도 재정의 하여 동일한 값이 반환 되도록 했기 때문

String

String을 선언할 때 힙메모리에 인스턴스로 생성되는 경우와 상수 풀(constant pool)에 있는 주소를 참조하는 방법 두 가지가 있다. 이때 상수 풀의 문자열을 참조하면 모든 문자열이 같은 주소를 가리킨다.

String str1 = new String("abc");	//생성자의 매개변수로 문자열 생성
String str2 = "test";				//문자열 상수를 가리키는 방식

String, StringBuilder, StringBuffer

  • String

    • 새로운 값을 할당할 때마다 새로운 메모리 영역을 가르킨다. 그 전의 값을 할당했던 메모리 영역은 Garbage로 남아있다가 GC에 의해 사라진다.
    • String에서 저장되는 문자열은 private final char[]의 형태이기 때문에 String 값은 바꿀수 없다.(immutable)
    • 두 개의 문자열을 연결하면 새로운 인스턴스가 생성된다.
      • 문자열 연결을 계속하면 Garbage Collector가 호출되기 전까지 생성된 String 객체들은 Heap에 garbage로 쌓이기 때문에 메모리 관리에 치명적이다.
    • String을 직접 더하는 것보다는 StringBuffer나 StringBuilder를 사용하는 것이 좋다.
  • StringBuilder, StringBuffer

    • 내부적으로 가변적인 char[] 배열을 가지고 있는 클래스이다. memory에 append 하는 방식으로 문자열을 변경할 수 있다. 따라서 문자열의 추가, 수정, 삭제가 빈번하게 발생할 경우라면 String 클래스가 아닌 StringBuffer/StringBuilder를 사용하는 것이 좋음.

    • StringBuilder

      • 변경가능한 문자열

      • 비동기 처리

      • 싱글 쓰레드에서는 성능이 더 좋음

    • StringBuffer

      • 변경가능한 문자열
      • 동기 처리
      • multiple thread 환경에서 안전한 클래스(thread safe)

동기화와 비동기화의 차이(Syncronous vs Asyncronous)

  • 동기화 방식: 한 자원에 대해 동시에 접근하는 것을 제한하는 방식.
    • system call이 끝날 때까지 다른 쓰레드의 접근을 막아버리는 것.
    • 메서드에 synchronized 붙여서 사용하면 됨
  • 비동기화 방식: 한 자원에 대해 동시 접근이 가능한 방식
    • system call이 왔든 말든 상관 없이 계속 호출할 수 있다.
    • Call back 함수를 통해 결과를 가져온다

Class 클래스

컴파일 후 생성된 class 파일에서 객체의 정보(멤버변수, 메서드, 생성자 등)를 가져올 수 있다.

reflection 프로그래밍

Class 클래스를 이용하여 클래스의 정보를 가져오고 이를 활용해서 인스턴스를 생성하고, 메서드를 호출하는 등의 프로그래밍 방식

  • 로컬 메모리에 객체가 없어서 객체의 데이터 타입을 직접 알 수 없는 경우(원격 클래스를 가져다 쓰는 경우 등) 객체 정보만을 이용하여 프로그래밍 할 수 있다.
  • 컴파일 시간(Compile Time)이 아니라 실행 시간(Run Time)에 동적으로 특정 클래스의 정보를 객체화를 통해 분석 및 추출해낼 수 있는 프로그래밍 기법이다.
    • 생성자(Constructor), 멤버 필드(Member Variables) 그리고 멤버 메서드(Member Method) 등을 사용할 수 있다.
  • 왜 사용할까?
    • 실행 시간에 다른 클래스를 동적으로 로딩하여 접근할 때
    • 클래스와 멤버 필드 그리고 메서드 등에 관한 정보를 얻어야할 때
    • 리플렉션 없이도 완성도 높은 코드를 구현할 수 있지만 사용한다면 조금 더 유연한 코드를 만들 수 있다.
  • 주의할 점
    • 외부에 공개되지 않는 private 멤버도 Field.setAccessible() 메서드를 true로 지정하면 접근과 조작이 가능하기 때문에 주의해야 한다

클래스 정보 가져오기

  1. Object 클래스의 getClass() 메서드 사용
String s = new String();
Class c = s.getClass();
  1. 클래스 파일 이름을 Class 변수에 직접 대입
Class c = String.class;
  1. Class.forName("클래스 이름") 메서드 사용
Class c = Class.forName("java.lang.String");	//클래스 이름은 패키지까지 풀네임
  • 클래스 이름은 String이기 때문에 오타가 나도 컴파일 타임엔 에러가 나지 않으므로 예외처리를 해줘야한다.
  • 런타임에 입력한 이름의 클래스가 있으면 메모리에 로딩시킨다.(동적 로딩)
profile
삐약 응애

0개의 댓글