프로그래밍 공부/JAVA

JAVA 중급 강의정리 Object클래스 ~ java.lang 패키지

Wonuk 2021. 8. 10. 02:02
반응형

본 포스팅은 프로그래머스 자바 중급 강의에 기반하여 작성되었습니다.

자바 강의의 모든 내용이 적힌것이 아닌 복습시 놓쳤던 부분을 하나하나 정리한 내용입니다.

순서 Object와 오버라이딩, java.lang패키지/오토박싱, Wrapper class, 스트링버퍼, 스트링 클래스의 문제점, Math

 

 

  • Object와 오버라이딩

Object클래스는 모든 클래스의 최상위 클래스

아무것도 상속받지 않으면 자동으로 Object를 상속

Object가 가지고 있는 메소드는 모든 클래스에서 다 사용할 수 있다는 것을 의미

 

자주 사용되는 메소드 사용할 때 반드시 오버라이딩 하여 사용해야 한다.

 

equals()        :     객체가 가진 값을 비교할 때 사용 (어떠한 기준을 만들어야한다.)

                        Object는 같은값인지 다른값인지를 비교할 수 있는 메소드는 제공하고 있지만

                        기준은 프로그래머가 정의해야한다. 오버라이딩

 

toString()      :      객체가 가진 값을 문자열로 반환

 

hashCode()    :      객체의 해시코드 값 반환

                         해시코드의 값은 되도록 객체별로 다른값을 가지도록 하는것이 좋다.

 

 

public class Student {
	String name;
	String number;
    int birthYear;
    
    public static void main(String[] args) {
    	Student s1 = new Student();
        s1.name = "홍길동";
        s1.number = "1234";
        s1.birthYear = 1995;
        
        Student s2 = new Student();
        s2.name = "홍길동";
        s2.number = "1234";
        s2.birthYear = 1995;
        
        if(s1.equals(s2)) {
        	System.out.println("s1 == s2");
        } else {
        	System.out.println("s1 != s2");
        } // 결과는 s1 != s2
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        // s1, s2의 hashCode는 각각 다른값이 나온다
    }
}

hashCode()와 equals()를 오버라이딩하여 조건을 내 마음대로 설정할 수 있다.

오버라이딩은 eclipse에서 source -> Generate 로 쉽게 만들어서 사용할 수 있다.

오버라이딩 하여 재설정되면 equals()를 사용하여 같다는 값을 출력할 수 있다.

public class Student {
	String name;
	String number;
    int birthYear;
    
    @Override
    public int hashCode() {
    	final int prime = 31;
        result = prime * result + ((number == null) ? 0 : number.hashCode());
        return result;
    }
    
    @Override
    public boolean equals(Object obj) {
    	if (this == obj)
        	return true;
      	if (obj == null)
        	return false;
        if (getClass() != obj.getClass())
        	return false;
        Student other = (Student) obj;
        
        if (number == null) {
        	if (other.number != null)
            	return false;
        } else if (!number.equals(other.number))
        	return false;
        return true;
    }
    
    public static void main(String[] args) {
    	Student s1 = new Student();
        s1.name = "홍길동";
        s1.number = "1234";
        s1.birthYear = 1995;
        
        Student s2 = new Student();
        s2.name = "홍길동";
        s2.number = "1234";
        s2.birthYear = 1995;
        
        if(s1.equals(s2)) {
        	System.out.println("s1 == s2");
        } else {
        	System.out.println("s1 != s2");
        } 
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        
    }
}

해당 예제의 오버라이딩은 elipse의 기능을 활용하여 만들어낸것

결과값으로 s1 == s2가 출력되고 hashCode의 값도 같은 값인것을 확인 할 수있다 

 

 

 

  • java.lang 패키지/오토박싱

자바는 기본적으로 다양한 패키지를 지원 그중에서 가장 중요한 패키지

 

 - java.lang패키지의 클래스는 import를 하지 않고도 사용할 수 있다.

 

 - java.lang패키지에는 기본형타입을 객체로 변환시킬때 사용하는 Wrapper클래스가 있다.

 

- Boolean, Byte, Short, Integer, Long, Float, Double 클래스

 

- 모든 클래스의 최상위 클래스인 Object도 java.lang패키지

 

- 문자열과 관련된 String, StringBuffer, StringBuilder도 모두 java.lang패키지

 

- 화면에 값을 출력할때 사용했던 System클래스도 java.lang패키지

 

- 수학과 관련된 Math클래스도 java.lang패키지

 

- Thread와 관련된 중요 클래스들이 java.lang패키지

 

이외에도 다양한 클래스와 인터페이스가 java.lang패키지에 속해 있다.

  public class WrapperExam {
        public static void main(String[] args) {
            int i = 5; 
            Integer i2 = new Integer(5);
            Integer i3 = 5;     //오토박싱
            int i4 = i2.intValue();
            int i5 = i2;       //오토언박싱
        }
    }
  • 오토박싱(Auto Boxing)
    • Integer i3 = 5; 숫자 5는 원래 기본형이지만 자동으로 Integer형태로 변환된다.
  • 오토 언박싱(Auto unboxing)
    • int i5 = i2; Integer객체타입의 값을 기본형 int로 자동으로 변환되어 값을 할당한다.
  • 오토박싱(Auto Boxing),오토 언박싱(Auto unboxing) 은 JAVA 5부터 지원한다. 이 때 내부적으로 Wrapper클래스들이 사용된다.

 

 

  • 스트링버퍼

 

아무 값도 가지고 있지 않은 StringBuffer객체를 생성

StringBuffer sb = new StringBuffer();
    // 해당 스트링 버퍼에 "hello", 공백, "world"를 차례대로 추가

    sb.append("hello");
    sb.append(" ");
    sb.append("world");
    // StringBuffer에 추가된 값을 toString()메소드를 이용하여 반환

    String str = sb.toString();
    System.out.println(str);

출력결과 : hello world

 

StringBuffer가 가지고 있는 메소드들은 대부분 자기 자신, this를 반환

	StringBuffer sb2 = new StringBuffer();
	StringBuffer sb3 = sb2.append("hello");
	if(sb2 == sb3){
	System.out.println("sb2 == sb3");
	}

- 자기 자신의 메소드를 호출하여 자기 자신의 값을 바꿔나가는 것을 메소드체이닝 이라고 한다.

- StringBuffer클래스는 메소드 체인 방식으로 사용할 수 있도록 만들어져 있다.

String str2 = new StringBuffer().append("hello").append(" ").append("world").toString();
System.out.println(str2);

- 앞에서 5줄로 작성했던 코드를 위와 같이 한 줄로 수정할 수 있습니다.(결과값 hello world)

- StringBuffer는 append메소드 외에도 길이를 구하거나, 자르거나 등의 다양한 메소드들을 가지고 있습니다.

 

 

  • 스트링 클래스의 문제점

String클래스는 문자열을 다룰때 사용하는 클래스

 

String클래스는 불변클래스 이다.

 

        String str1 = "hello world";
        String str2 = str1.substring(5);
        System.out.println(str1);
        System.out.println(str2);

실행결과

hello world

 world

 

- 기존의 str1은 전혀 변화 없다.

- substring메소드는 5번째 부터 문자열을 잘라서 새로운 문자열을 반환하는 메소드

- str1자체는 전혀 변화가 없다.

 

String클래스를 사용할 때 가장 문제가 발생하는 경우는 다음과 같은 코드를 사용할 때 입니다.

    String str3 = str1 + str2;
    System.out.println(str3);

실행결과

hello world world

 

문자열과 문자열을 더하게 되면 내부적으로는 다음과 같은 코드가 실행

String str4 = new StringBuffer().append(str1).append(str2).toString();
System.out.println(str4);

문자열을 반복문 안에서 더하는 것은 성능상 문제가 생길 수 있으니 반드시 피하도록 합시다.

 

String str5 = "";
for(int i = 0; i < 100; i++) {
	str5 = str5 + "*";
}
System.out.println(str5);

실행결과

****************************************************************************(100개)

 

실제 반복문 안에서 문자가 더해질 때 마다 100번 동안 내부적으로 String객체를 만들어 낸다

자바는 new 연산자가 많이 사용될수록 느려진다 그래서 좋지않다.

 

StringBuffer sb = new StringBuffer();
for(int i = 0; i < 100; i++) {
	sb.append("*");
}
String str6 = sb.toString();
System.out.println(str6);

같은 결과이지만 StringBuffer를 활용하여 반복문을 작성하면 new를 하지않기 때문에 훨씬 효율적이다

 

 

  • Math

Math클래스는 이름 그대로 수학계산을 위한 클래스

코싸인, 싸인, 탄젠트, 절대값, 랜덤값을 구할 수 있는 클래스

 

Math클래스는 생성자가 private으로 되어 있기 때문에 new 연산자를 이용하여 객체를 생성할 수 없다.

 

객체를 생성할 수는 없지만 모든 메소드와 속성이 static으로 정의되어 있기 때문에 객체를 생성하지 않고도 사용할 수 있다.

 

    public class MathExam {
        public static void main(String[] args) {
            int value1 = Math.max(5, 20); // 두 값중에 더 큰값을 구하는 메소드
            System.out.println(value1); // 출력값 20
           
            int value2 = Math.min(5, 30); // 작은값
            System.out.println(value2); // 출력값 55
           
            int value3 = Math.abs(-10); // 절대값
            System.out.println(value3); // 출력값 30
            
            double value4 = Math.random(); // 랜덤 0이상 1미만의 랜덤한 값
            double value5 = Math.sqrt(25); // 제곱근
            
            System.out.println("2의 10승 = " + Math.pow(2, 10));
            System.out.println("16의 1/2승 = : " + Math.pow(16, 0.5));
            System.out.println("log200 = " + Math.log10(200));
        }
    }

 

반응형