본 포스팅은 프로그래머스 자바 중급 강의에 기반하여 작성되었습니다.
자바 강의의 모든 내용이 적힌것이 아닌 복습시 놓쳤던 부분을 하나하나 정리한 내용입니다.
순서 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));
}
}
'프로그래밍 공부 > JAVA' 카테고리의 다른 글
JAVA 중급강의 정리 Date, Calendar, java.time패키지 (0) | 2021.08.11 |
---|---|
JAVA 중급 강의정리 java.util 패키지, Generic, 컬렉션 프레임워크 (0) | 2021.08.10 |
JAVA 입문 강의정리 예외 Exception, throws (0) | 2021.07.25 |
JAVA 입문 강의정리 인터페이스 (0) | 2021.07.22 |
JAVA 입문 강의정리 상속 (0) | 2021.07.21 |