TIL -day6

정상화·2023년 2월 27일
0

TIL

목록 보기
3/46
post-thumbnail

String 불변성

String str = "a";
str += "b";
str += "c";

위 코드에서 총 생성되는 String의 개수를 알아보자.
자바에서 스트링은 String Pool 이라고 불리는 공간에 실제 불변 문자열들이 저장돼있고 String 변수가 이를 참조하는 형태이다.

따라서 str이라는 문자열 변수에 변형이 일어나도 실제 "a"가 변하는 것이 아니다.

  1. a 가 생성
  2. ab가 생성
  3. abc가 생성

이런 식으로 문자열의 연산이 이루어지게 된다. 물론 "b"와 "c"도 생성된다.

생짜 String으로 문자열 연산을 하면 객체생성을 반복해서 하는 셈이기 때문에 보통은 StringBuilder 를 이용한다.

예시

StringBuilder sb = new StringBuilder("a");
sb.append("b");
sb.append("c");

toString()

자바가 알아서 센스있게 객체를 객체를 설명하는 문자열로 표현하게 하고 싶은 경우가 있을 것이다.

System.out.println(new Member("David", 17));
// David는 17살이다.

클래스에 toString()메서드를 오버라이드하면 된다.

class Member{
	private String name;
    private int age;
    
   	public Member(String name, int age){
    	this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString(){
    	return String.format("%s는 %d살이다.", name, age);
    }
}

static

클래스 자체의 정보, 모든 객체에게 동일하게 공유될 필요가 있는 정보는 static으로 선언한다.
static 멤버는 static 멤버들끼리만 접근할 수 있다.

static 멤버는 객체가 생성되기 전부터 이미 존재하기 때문에 static 멤버가 일반 인스턴스 멤버를 접근한다는 것 자체가 시간적인 모순이 발생한다.

지네릭스

하나의 클래스가 여러 타입에 대해 비슷한 작업을 한다면 여러 타입마다 클래스를 만들어야 할까?
이러한 중복 문제를 해결하는 것이 지네릭스이다.

예시

class 저장소 <T>{
    T data;

    T getData(){
        return data;
    }

    void setData(T inputData) {
        this.data = inputData;
    }
}

저장소에 넣을 inputData가 int이든, double이든, Optional이든, 누가 만든 3자 클래스이든 위 저장소 클래스 하나로 해결할 수 있다.

저장소<Integer> container = new 저장소<>(); 
// 앞에서 타입 정의가 일어나면 new 뒤에 타입 정의는 생략 가능하다.
저장소<Double> container2 = new 저장소<>();

container2.setData(3.44);
double doubleVal = container2.getData();

Scanner

Scanner sc = new Scanner(System.in);

Scanner 객체를 생성해서 키보드 입력을 받을 수 있다. 생성자의 파라미터로 표준입력(키보드)를 넣어줘야 키보드 입력을 sc가 받는다.

int number = sc.nextInt();
profile
백엔드 희망

0개의 댓글