[F-lab 모각코 챌린지 22일차] TIL

JeongheeKim·2023년 6월 21일

TIL

목록 보기
22/66

❓toString은 언제 호출될까?

  • toString()은 객체에 대한 정보를 문자열로 표현하는 메소드이다.
  • 객체에 대해 더하기 연산을 하는 경우
    • toString()이 자동으로 호출
  • System.out.println() 메소드에 매개 변수로 들어가는 경우
    • 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()호출 할 때 java.lang.StackOverflowError가 발생 할 수 있다.
  • 아래 예제 코드를 보면 Member클래스와 Coupon클래스가 서로 참조하고있다. toString() 호출 시 서로의 객체에 대한 정보를 출력하려하니 java.lang.StackOverflowError가 발생하는것이다.
    • 아래 예제는 순수 자바로 구현했지만 롬복 사용 시 무분별한 사용은 지양해야한다. @ToString.Exclude을 참조자료형 앞에 붙여 StackOverflowError를 피할 수 있다.
    • https://projectlombok.org/features/ToString
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]

0개의 댓글