Java API, Object Class & Wrapper Class

alert("april");·2023년 7월 14일
0

java

목록 보기
3/9
post-thumbnail

출처: https://medium.com/@rickrohan2021/web-api-and-web-service-introduction-and-key-differences-37decf527cb5

API (Application Programming Interface)

개발에 필요한 라이브러리들의 집합
선배 개발자들이 만들어 놓은 소스코드

- 내부 API
	JDK 설치 시 제공해주는 기본 API
	docs.oracle.com/javase

- 외부 API(회사에서 많이 쓴다)
	선배 개발자들이 개발한 패키지 및 클래스들을 의미한다.
	보통 JAR파일로 배포하며 자바 프로젝트의 buildPath에 추가하여 사용할 수 있다.

ex)
/**
*주석을 꼭 달아줘야 한다
*@author Choi Yura
*@since JDK 11
*
*Calculator
*/

JAR 파일로 배포하기

배포할 클래스 또는 패키지 우클릭
> Export > JAVA/JAR file 선택 > Next
> destination을 원하는 경로로 선택
> Export Java source files ... 체크
> Finish

JAR 파일을 프로젝트에 추가하기

배포된 JAR파일을 다운 받기
> 프로젝트 우클릭 > Build Path > Configure Build Path
> Libraries 탭 클릭 > ClassPath(안되면 ModulePath) 클릭 > Add External JARs
> 저장된 경로의 .jar파일을 더블 클릭으로 추가 > Apply 클릭
> Orders and Exports 탭 클릭
> Select All 클릭 > Apply and Close

Object 클래스(최상위 부모 클래스, 모든 클래스는 자동으로 Object를 상속받는다.)

1. toString()
	항상 객체명을 출력할 때에는 toString()이 생략되어 있다.
	toString()을 통해 출력되는 문자열이 마음에 들지 않는다면, 재정의하여 수정하도록 한다.
	실무에서는 클래스 선언 시 각 필드의 초기화 여부를 확인하기 위해 toString을 재정의하여 사용한다.

2. equals()
	주소값 비교(==).
	String 클래스에서 equals를 값 비교로 재정의하여 사용하기 때문에
	문자열 비교는 무조건 equals()로 비교한다.

3. hashCode()
	JVM에서 관리하는 중복없는 값. 실제 메모리에 할당되는 주소와 다르다.
	String 클래스에서는 필드의 해시코드값이 아닌 필드 안에 있는
	문자열 상수값의 해시코드값을 리턴하도록 재정의하였다.

Constant Pool

상수가 넘쳐나는 영역이라는 뜻
문자열 자체를 넣으면 "ABC" 가 이미 있으면 또 만들지 않고 주소값을 공유
그래서 == 이든 equals 든 true

선언을 그냥 값을 넣어주는 걸로 하면 우선순위가 상수의 주소 비교가 높아서
값을 넣는 걸 알려준 게 아닌 생성자로 필드를 만들어 알려줌.

new 로 넣어주면 필드 비교가 우선순위가 높아서 false 가 나온다.

Object 클래스 예시

EqualsTest.java 클래스

package objectTest;

class Student{
  int number;
  String name;
  
  public Student() {;}

  public Student(int number, String name) {
     super();
     this.number = number;
     this.name = name;
  }

  @Override
  public String toString() {
     return "Student [number=" + number + ", name=" + name + "]";
  }
  
  @Override
  public boolean equals(Object obj) {
//      주소비교
     if(this == obj) {
        return true;
     }
     
//      타입비교
     if(obj instanceof Student) {
//         다운 캐스팅
        Student s2 = (Student)obj;
        if(this.number == s2.number) {
           return true;
        }
     }
     return false;
  }
}

public class EqualsTest {
  public static void main(String[] args) {
     
     String data1 = "ABC";
     String data2 = "ABC";
     String data3 = new String("ABC");
     String data4 = new String("ABC");
     
     System.out.println(data1 == data2);
     System.out.println(data1.equals(data2));
     System.out.println(data3 == data4);
     System.out.println(data3.equals(data4));

	   Student s1 = new Student(1, "April");
	   Student s2 = new Student(1, "Jay");
			   
	   System.out.println(s1.equals(s2));
   	
  }
}

HashCodeTest.java 클래스

package objectTest;

import java.util.Random;

public class HashCodeTest {

	public static void main(String[] args) {
		
		String data1 = "ABC";
		String data2 = "ABC";
		String data3 = new String("ABC");
		String data4 = new String("ABC");
		
		System.out.println(data1.hashCode());
		System.out.println(data2.hashCode());
		
	//   new를 사용했기에 필드 우선순위가 높아야하지만
	//   String 클래스에서 재정의를 해서 필드 안에 값의 해쉬코드를 가져오도록 한다.
		
		Random r1 = new Random();
		Random r2 = new Random();
		System.out.println(r1.hashCode());
		System.out.println(r2.hashCode());

	}
}


ToStringTest.java 클래스

package objectTest;

import java.util.Random;

class Animal{
	
	String name;
	String kind;
	int age;
	
	public Animal() {;}

	public Animal(String name, String kind, int age) {
		super();
		this.name = name;
		this.kind = kind;
		this.age = age;
	}
	
	
	
	@Override
	public String toString() {
		return "이름 : " + name + ", " + "종 : " + kind +", " + "나이 : " + age;
	}
	
}

public class ToStringTest {
	public static void main(String[] args) {
		
		Random r = new Random();
//		항상 객체명을 출력할 때에는 toString()이 생략되어 있었다!!
		System.out.println(r.toString());
	
		Animal animal = new Animal("진순이", "진돗개", 0);
//		초기화가 잘됐는지 확인할 때 사용할 수도 있다.
		System.out.println(animal);
		
	}
	
}


Wrapper Class : 기본 자료형들의 클래스 타입

클래스타입 객체 = new 클래스타입(일반타입의 값); // boxing, 권장하지 않는다.
클래스타입 객체 = 클래스타입.valueOf(일반타입의 값); // boxing
일반타입 변수 = 객체.000Value(); // unboxing

클래스타입 객체 = 일반타입의 값; // auto boxing
일반타입 변수 = 객체; // auto unboxing

Wrapper Class 를 사용하는 이유

원시타입(일반타입)을 박싱하면 다양한 메소드를 제공받을 수 있다.
여러 일반 타입을 하나의 타입으로 묶기 위해서는 반드시 클래스 타입(Wrapper Class)으로
사용해야 되고, 이 때에는 박싱을 해준다.	

Wrapper Class 예시

WrapperTask.java 클래스

package wrapperTest;

public class WrapperTask {

	public static void main(String[] args) {
//		1, 3.14, 45.1F, 'H', "april짱", true
//		위 6개의 값을 6칸 배열에 담기
		
//		for문 사용해서 배열에 담긴 값 출력까지!
		
//		My version
//		String[] randomArray = {1, 3.14, 45.1F, 'H', "april짱", true};
//		
//		for (int i = 0; i < randomArray.length; i++) {
//			System.out.println(i);
//		}
		
//		Answer
//		Object[] datas = new Object[6];
		Object[] datas =  {1, 3.14, 45.1F, 'H', "april짱", true};
		
		Integer number = (Integer)datas[0]; //  다운캐스팅을하면 Integer타입의 친구를 사용할 수 있다.
		
		
		for (int i = 0; i < datas.length; i++) {
			System.out.println(datas[i]);
		}
		
	}

}

WrapperTest.java 클래스

package wrapperTest;

public class WrapperTest {

	public static void main(String[] args) {
		
		int number = 10;

//		boxing
		
//		디프리케이티드 이제 더 이상 이렇게 쓰지말자!
//		valueOf 를 쓰는게 더 좋다.
//		Integer number_W = new Integer(number);
//		Integer number_W = Integer.valueOf(number);
		
		Integer number_W = number;
		System.out.println(number_W);
		
//		unboxing
		number = number_W.intValue();
		
//		auto unboxing
		number = number_W;
		
		
	}

}

profile
Slowly but surely

0개의 댓글

관련 채용 정보