2021. 04. 13(화) TIL

eastgun_·2021년 4월 13일
0

Java

API(Application Programming Interface)

  • 프로그래밍 언어, 라이브러리, 프레임워크각 제공하는 기능
  • API가 제공하는 기능을 제어(사용)할 수 있게 만든 인터페이스

※ final

  • final 변수명 - 값 변경 금지
  • final 메소드 - 하위 클래스 재정의 금지
  • final 클래스 - 이 클래스를 상속받아서 하위클래스를 작성할 수 없음

Object 클래스

  • 배열을 포함한 모든 객체의 최상위 부모클래스다.
  • 명시적으로 extends를 사용해서 부모클래스를 지정하지 않으면 무조건 extends Object로 간주된다.
  • Object의 모든 메소드는 모든 클래스가 상속받는다.
  • 모든 객체는 Object의 메소드를 사용할 수 있다.
  • Object에는 객체와 관련된 필수 기능들이 구현되어 있다.

Object 클래스 주요 메소드

  • boolean equals(Object obj)
    • 현재 객체와 전달받은 객체가 동일한 객체인지 여부를 반환한다.
    • 객체들의 주소값(참조값)을 비교한다.
    • 재정의 가능
  • int hashCode()
    • 현재 객체의 해시코드값을 반환한다.
    • 재정의 가능
  • String toString()
    • 현재 객체에 대한 간단한 정보를 제공한다.
    • 클래스이름@16진수해시코드
    • 재정의 가능
  • Class<?> getClass()
    • 현재 객체에 대한 설명서 정보를 제공한다.
  • Object clone()
    • 현재 객체를 복제한 복사본을 생성해서 제공한다.
package object;

public class ObjectApp1 {

	public static void main(String[] args) {
		Person p1 = new Person(10, "홍길동", "hong@gmail.com");
		Person p2 = new Person(10, "홍길동", "hong@gmail.com");
		Person p3 = p1;
		Person p4 = p2;
		
		// boolean equals(Object obj) 메소드
		// 객체 자신과  obj객체가 동일한 객체인지 여부를 반환한다
		boolean result1 = p1.equals(p2);
		boolean result2 = p2.equals(p1);
		
		System.out.println("p1이 참조하는 객체와 p2가 참조하는 객체가 같은 객체인가?" + result1);
		System.out.println("p2이 참조하는 객체와 p1가 참조하는 객체가 같은 객체인가?" + result2);
	}
}
package object;

public class ObjectApp2 {

	public static void main(String[] args) {
		Person p1 = new Person(10, "홍길동", "hong@gmail.com");
		Person p2 = new Person(20, "김유신", "kim@naver.com");
		
		// String toString()
		// 객체에 대한 간단한 정보를 문자열로 변환한다.
		// 객체의 멤버변수에 저장된 정보를 반환하도록 재정의해서 사용한다.
		System.out.println(p1); // 참조변수값을 출력하면 참조변수.toString()의 반환값이 출력된다.
		System.out.println(p2);
		System.out.println(p1.toString());
		System.out.println(p2.toString());
	}
}

StringBuilder와 StringBuffer

  • 임시저장소(버퍼)를 가지고 있어서, append(다양한 타입의 데이터)로 새로운 객체 생성없이 임시저장소에 데이터를 저장할 수 있다.
  • 임시저장소에 저장된 데이터는 toString() 메소드를 실행해서 문자열(String)로 제공받을 수 있다.
  • StringBuilder와 StringBuffer의 사용법은 완전히 동일하다.
    • StringBuffer는 멀티스레드환경에서 안전하게 사용할 수 있지만 속도가 느리다.
    • StringBuilder는 멀티스레드환경에서 안전하지 않지만, 속도는 빠르다.
  • 사용 예제
      String text = "국어" + 70 + "수학" + 80 + "영어" + 100;
      // ["국어"]		     	
      // ["국어70"]				
      // ["국어70수학"]				
      // ["국어70수학80"]			
      // ["국어70수학80영어"]  
      // ["국어70수학80영어100"]
      // text에 최종적으로 대입되는 값은 "국어70수학80영어100" 다.
      // String객체의 불변특성 때문에 불필요한 객체 5개가 추가로 생성된다.
    
      StringBuilder sb = new StringBuilder();
      sb.append("국어");	// 버퍼에 저장
      sb.append(70);		// 버퍼에 저장
      sb.append("수학");	// 버퍼에 저장
      sb.append(80);		// 버퍼에 저장
      sb.append("영어");	// 버퍼에 저장
      sb.append(100);		// 버퍼에 저장
      String finalText = sb.toString(); // 버퍼에 저장된 데이터가 전부 연결된 문자열이 반환된다.
  • StringBuilder를 사용하면 "+" 연산을 사용해서 이어붙이기 할 때 보다 불필요한 객체의 생성이 억제되어서 메모리 효율 및 실행 성능이 개선된다.

Wrapper 클래스와 Auto-Boxing/Unboxing

Wrapper 클래스

  • 기본자료형 타입에 대응되는 클래스다.
  • 기본자료형 값을 가지고 있는 객체를 만들 수 있다.
  • java.lang 패키지에 정의되어 있다.
  • 사용해야 할 때
    • 기본자료값이 아닌 객체로 저장해야할 때
    • 호출할 메소드의 매개변수가 객체를 요구할 때
    • null값이 저장될 가능성이 있을 때
    • 해당 기본자료형값에 대한 다양한 기능을 실행해야 할 때
  • 지원하는 Wrapper 클래스
    | 기본자료형 | Wrapper 클래스|
    | --- | --- |
    | byte | Byte |
    | short | Short |
    | int | Integer |
    | long | Long |
    | float | Float |
    | double | Double |
    | char | Character |
    | boolean | Boolean |

오토박싱/오토언박싱

  • JAVA 1.5버전부터 도입된 기능
  • 기본자료형 타입과 Wrapper객체 타입간의 변환을 자동으로 지원한다.
  • 오토박싱
      Integer instance = new Integer(10);  // 박싱
      
      Integer instance = 10;  // 오토박싱 
      // Integer instance = new Integer(10); // 실제로 실행되는 코드
  • 오토언박싱
      Integer instance = new Integer(10);  // 박싱
      int value = instance.intValue();      // 언박싱
    
      int value = instance; // 오토 언박싱
      // int value = instance.intValue(); // 실제로 실행되는 코드
  • 실제 활용 예제
      public class Sample {
        public void test1(int value) {
          수행문
        }
        
        public void test2(Integer instance) {
          수행문
        }
      }
      public static void main(String args) {
        Sample sample = new Sample();
    
        sample.test1(1);
        sample.test2(1); // 실제 실행되는 코드 sample.test2(new Integer(1));
      }
profile
게으르고 싶은 예비 개발자입니다.

0개의 댓글