System.out.println()에 참조자료형을 매개변수로 넘겼을 경우 toString()이 바로 호출되는것이 아니라 내부적으로 String.valueOf()를 호출한 뒤, valueOf메서드에서 null이 아닌 경우 toString을 호출하고 있다.
public void print(Object obj) {
write(String.valueOf(obj));
}
//String 클래스
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
→ System.out.println()에서 toString()을 바로 호출하지 않는 이유중 하나는 null값에 대한처리때문이다. System.out.println()은 Object를 매개변수로 받는데, null이 매개변수로 넘어올 경우 obj.toString시 NullPointerException이 발생할 수 있으므로 String.valueOf()를 통해 안전성을 보장한다고 한다.
toString() 사용을 지양해야하는 이유@ToString.Exclude을 참조자료형 앞에 붙여 StackOverflowError를 피할 수 있다.public class Member {
private List<Coupon> couponList = new ArrayList<>();
public List<Coupon> getCouponList() {
return couponList;
}
@Override
public String toString() {
return "Member{" +
"couponList=" + couponList +
'}';
}
}
public class Coupon {
private long id;
private Member member;
public Coupon(Member member) {
this.member = member;
}
@Override
public String toString() {
return "Coupon{" +
"id=" + id +
", member=" + member +
'}';
}
}
public class Main {
public static void main(String[] args) {
Member member = new Member();
Coupon coupon = new Coupon(member);
member.getCouponList().add(coupon);
System.out.println(member);
System.out.println(coupon);
}
}
Exception in thread "main" java.lang.StackOverflowError
at tostringtest.Member.toString(Member.java:20)
at java.base/java.lang.String.valueOf(String.java:2951)
at tostringtest.Coupon.toString(Coupon.java:19)
at java.base/java.lang.String.valueOf(String.java:2951)
at java.base/java.lang.StringBuilder.append(StringBuilder.java:168)
at java.base/java.util.AbstractCollection.toString(AbstractCollection.java:473)
at java.base/java.lang.String.valueOf(String.java:2951)
at tostringtest.Member.toString(Member.java:20)
at java.base/java.lang.String.valueOf(String.java:2951)
at tostringtest.Coupon.toString(Coupon.java:19)
# 나의풀이
def solution(a, b):
answer1 = str(a) + str(b)
answer2 = str(b) + str(a)
if int(answer1) > int(answer2):
return int(answer1)
else:
return int(answer2)
max 메소드를 통해 코드를 한줄로 줄일 수 있다.
# 다른사람풀이
def solution(a,b):
a, b = str(a), str(b)
return int(max(a+b, b+a))
최대공약수 구하기 내장함수 : math.gcd
import math
def solution(numer1, denom1, numer2, denom2):
number = (numer1 * denom2) +(numer2 * denom1)
denom = (denom1 * denom2)
**gcd = math.gcd(number, denom)**
return [number//gcd, denom//gcd]