기록공간

Java의 주요 클래스(1) 본문

Java

Java의 주요 클래스(1)

입코딩 2020. 8. 26. 22:56
반응형

개요

일반적으로 클래스는 하나만 존재하는 것이 아니라 같은 종류의 클래스를 여러개 묶어서 사용하게 되는데, 이러한 클래스나 인터페이스의 묶음을 패키지(package)라고 한다. Sun(Oracle)사에서는 자바 프로그램을 효율적으로 작성할 수 있도록 자바 표준 패키지를 제공하며, 자바 표준 패키지에는 그래픽, 네트워크, 데이터베이스 등의 다양하고 유용한 클래스들이 포함되어 있다.

 

import 구문

자바 표준 패키지나 사용자에 의해 외부에서 만들어진 패키지를 사용하기 위해서는 컴파일을 수행하기에 앞서 프로그램에 포함시키는 과정이 필요한데, 이 때 import 문을 이용하여 패키지 또는 클래스를 프로그램에 포함시키게 된다. 

 

하지만, java.lang.* 패키지는 자바 프로그램에 기본적으로 import 되어 있기 때문에 이 패키지의 클래스들은 import 하지 않고 바로 사용하는 것이 가능하다.

 

import 문은 반드시 클래스 설계 구문 전에 선언되어 있어야 하며 형식은 다음과 같은 두 가지가 있다.

 

import (static) 패키지.클래스;
import (static) 패키지.*;

※ JDK 1.5 부터는 import 다음에 static 키워드를 붙임으로써 정적으로 패키지를 import 할 수 있는 기능을 제공하게 되었다. 만약 패키지를 정적으로 import 한 경우라면 모든 접근 가능한 메소드와 멤버 변수들은 접두사를 붙이지 않고 사용하는 것이 가능하다.

 

Object 클래스

java.lang.Object 클래스는 자바 클래스의 최상위 클래스로 자바 표준 패키지의 클래스나 사용자에 의해 작성된 모든 클래스는 기본적으로 이 클래스로부터 상속받는다. 따라서 자바의 모든 클래스는 java.lang.Object 클래스의 메소드를 가지고 있으며, 바로 사용하는 것이 가능하다.

 

toString() 메서드

 

Test ob1 = new Test();

System.out.println("ob1            : " + ob1);           
System.out.println("ob1.toString() : " + ob1.toString());
// --==>> ob1            : Test@15db9742                 
//        ob1.toString() : Test@15db9742                 

다음 코드처럼 ob1이라는 Test 인스턴스를 만들고 자체 변수나 toString() 메서드를 호출하면 <클래스명@16진수해시코드> 형식의 정보를 출력한다. 해시코드는 메모리의 주소값이 아닌 자바 내부적으로 객체를 구분하기 위해 사용하는 값이다. 그리고 해시코드가 서로 같다고 해서 같은 객체는 아닐 수 있다는 점을 유의하자. (hashCode() 메서드를 호출하면 클래스명을 제외한 해시코드만 10진수 형태로 나오게된다.)

 

getClass() 메서드

NewCar nCar1 = new NewCar(100, "볼보", 4);
System.out.println("nCar1 : " + nCar1.getClass());
// --== >> nCar1 : class NewCar                  

getClass() 메서드는 생성된 객체를 통해 기반 설계도 클래스를 확인할 수 있는 기능을 가지고 있다. 만약 상속을 한 경우에는 인스턴스 생성시 new 클래스명 기준으로 클래스 이름을 반환한다.

 

그 외에 clone(), finalize(), 등의 메서드들이 존재한다.

 

Wrapper 클래스

자바에서는 언어 수준에서 제공하는 기본형 데이터를 제외한 나머지는 클래스로 정의하여 객체 단위로 처리한다. 따라서 자바에서는 이러한 기본형 데이터를 객체 단위로 처리할 수 있도록 클래스를 제공할 수 밖에 없는데 이러한 클래스들을 가리켜 Wrapper 클래스라고 한다.

 

* Wrapper 과정 예

"10"  → String → 객체 → Object
                                    ↓
                                   객체 → Integer → 메소드 parseInt() → 10

자바는 기본 자료형인 byte, short, int, long, float, double, char, boolean 형에 대응하는 Byte, Short, Integer, Long, Float, Double, Character, Boolean의 Wrapper 클래스와 큰 숫자들을 다루기 위한 java.math.BigIntegerjava.math.BigDecimal 클래스를 제공한다. 

 

Wrapper 클래스는 java.lang 패키지에 포함되어 있으므로 별도의 import 과정 없이 바로 사용하는 것이 가능하며 기본형과 마찬가지로 Wrapper 클래스도 내부 메소드를 통해 형변환이 가능하고 동등 비교와 같은 연산도 가능하다.

 

예를들면 java.lang.Integer 클래스는 int 기본 자료형의 Wrapper 클래스로 정수를 다루는데 필요한 상수나 메소드, 진수, 변화등에 필요한 메소드 등을 포함하고 있다.

static int parseInt(String s)
-> 문자열 형식으로 저장된 숫자를 정수 형태로 반환

static Integer valueOf(int i)
-> int형을 Integer 형으로 변환

byte byteValue(), int intValue(), short shortValue(), long longValue(), 
float floatValue(), double doubleValue()...
-> 해당 기본 자료형으로 형 변환한 값을 반환

 

오토 박싱(Auto-Boxing)과 오토 언박싱(Auto-Unboxing)

일반적으로 레퍼런스 형과 기본 자료형은 호환되지 않으며 이 경우 발생하는 문제를 해결하기 위해 자바에서는 Wrapper 클래스를 제공하게 되었다. JDK 1.5 부터 레퍼런스 형과 기본 자료형이 다음과 같은 방식으로 형 변환이 가능하게 되었다.

   int a = 10, b;
   Integer ob;
   ob = a;
   // -- 기본 자료형(int)이 Integer 형으로 자동 변환(오토 박싱) -> 자동적으로 자유로웠던 놈을 가둔다.
   //    실제로는 ... [ob = new Integer(a);]

   b = ob;
   // -- Integer(객체)가 기본 자료형 int 형으로 자동 변환(오토 언박싱)
   //    실제로는 ... [b = ob.intValue();]

   //이는 JDK 1.5 이후 추가된 오토 박싱 / 오토 언박싱이라는
   //기능으로 인해 가능해진 것이다.

 

예제)

public class Test135
{
	public static void main(String[] args)
	{
		int a = 10, b;
		Integer c;
		Object d;

		b = a; // -- int 형 데이터(자료) -> int형 변수
		c = new Integer(0);

		// ※ 레퍼런스 형(참조 타입)과 기본 자료형(값 타입)은 호환되지 않는다.

		b = c;			   // -- Integer 형 데이터(객체) -> int 형 변수(오토 언박싱)
		b = c.intValue();  // -- 언박싱

		d = new Object();
		System.out.println("d.toString() : " + d.toString());
		// --==>> d.toString() : java.lang.Object@15db9742

		d = new Integer(10);	// -- 업캐스팅
		System.out.println("d.toString() : " + d.toString());
		// --==>> d.toString() : 10

		d = new Double(12.345);	// -- 업캐스팅
		System.out.println("d.toString() : " + d.toString());
		// --==>> d.toString() : 12.345

		d = 10;		// -- 오토 박싱

		/*
		Integer i = 10;
		-> Integer i = new Integer(10);
		
		Object o = i;
		-> Obejct o = new Integer(10);

		Object o = 10;
		*/
		System.out.println("d.toString() : " + d.toString());
		//--==>> d.toString() : 10

	}
}

 

예제2) - 특정 레퍼 클래스의 메소드 사용해보기

public class Test136
{
	public static void main(String[] args)
	{
		boolean bi = true;
		Boolean wrapbi = new Boolean(bi);
		Boolean wBi = bi;		// -- 오토 박싱

		int n = 300;
		Integer wrapn = new Integer(n);
		int n2 = wrapn;			// -- 오토 언박싱

		float f = 300.3f;
		Float wrapf = new Float(f);

		System.out.println(wrapbi.toString());
		System.out.println(wrapn.toString());
		System.out.println(wrapf.toString());
		// --==>> true
		//	      300
		//        300.3

		System.out.println(wrapbi);
		System.out.println(wrapn);
		System.out.println(wrapf);
		// --==>> true
		//	      300
		//        300.3


		// Integer 클래스

		String sn = "12";
		int ni = Integer.parseInt(sn);
		System.out.printf("ni : %3d\n", ni);
		// --==>> ni :  12

		ni = Integer.parseInt("0101", 2);
		System.out.printf("ni : %3d\n", ni);
		// --==>> ni :   5

		ni = Integer.parseInt("12", 8);
		System.out.printf("ni : %3d\n", ni);
		// --==>> ni :  10

		ni = Integer.parseInt("A", 16);
		System.out.printf("ni : %3d\n", ni);
		// --==>> ni :  10

		sn = Integer.toBinaryString(20);
		System.out.printf("sn : %s\n", sn);
		// --==>> sn : 10100

		sn = Integer.toHexString(31);
		System.out.printf("sn : %s\n", sn);
		// --==>> sn : 1f

		sn = Integer.toOctalString(31);
		System.out.printf("sn : %s\n", sn);
		// --==>> sn : 37

		Integer num = new Integer(50);
		System.out.println(num.toString());
		// --==>> 50

		int n3 = 345;
		Integer n4 = Integer.valueOf(n3);
		System.out.println(n4);
		// --==>> 345

		
	}
}

 

예제3) - BigInteger Wrapper 클래스

import java.math.BigInteger;

public class Test137
{
	public static void main(String[] args)
	{
		//int a1 = 123456789123456789;
		//long b1 = 123456789123456789123456789L;
		//System.out.println(b1);

		BigInteger a = new BigInteger("123456789123456789");
		BigInteger b = new BigInteger("123456789123456789");

		//BigInteger c = a + b;
		//System.out.println(c);

		// 더하기
		BigInteger c = a.add(b);
		System.out.println("덧셈 결과 : " + c);
		// --==>> 덧셈 결과 : 246913578246913578
		
		// 빼기
		BigInteger d = a.subtract(b);
		System.out.println("뺄셈 결과 : " + d);
		// --==>> 뺄셈 결과 : 0

		// 곱하기
		BigInteger e = a.multiply(b);
		System.out.println("곱셈 결과 : " + e);
		// --==>> 곱셈 결과 : 15241578780673678515622620750190521

		// 나누기
		BigInteger f = a.divide(b);
		System.out.println("나눗셈 결과 : " + f);
		// --==>> 나눗셈 결과 : 1

		
		// 지수승
		BigInteger g = new BigInteger("2");
		System.out.println("2의 3승 : " + g.pow(3));
		// --==>> 2의 3승 : 8
	}
}

 

예제4)-BigDecimal Wrapper 클래스

import java.math.BigDecimal;

public class Test138
{
	public static void main(String[] args)
	{
		BigDecimal a = new BigDecimal("123456789.123456789");

		// movePointLeft : 소수점을 왼쪽으로 이동
		BigDecimal b = a.movePointLeft(3);
		System.out.println("처리 결과 : " + b);
		// --==>> 처리 결과 : 123456.789123456789

		// 나눗셈 (두 번째 파라미터 확인) -> 반올림 하지 않는다. -> 절삭
		BigDecimal c = a.divide(b, BigDecimal.ROUND_DOWN);
		System.out.println("처리 결과 : " + c);
		// --==>> 처리 결과 : 1000.000000000

		System.out.println(BigDecimal.ROUND_DOWN);
		// --==>> 1

		// BigInteger 객체로 변환
		System.out.println(a.toBigInteger());
		// --==>> 123456789
	}
}
반응형
Comments