[Java] String, final, abstract

JOY·2023년 3월 8일
0

[Java]

목록 보기
8/15
post-thumbnail

String, StringBuffer, StringBuilder

  • String 은 상수 = 값변경 불가
  • String str = "하이"; //str에 주소값이 담김
  • str = "hi"; //값 변경(사실상 아님 - why? 계속해서 가비지컬렉션이 발생)
  • String 값 누적/변경 시 사용하려고 할때?
  • 문자열을 지속적으로 삭제or변경 시 StringBuilder, StringBuffer 사용
  • StringBuilder - 비동기화 처리
  • StringBuffer - 동기화 처리
  • 쓰레드 - StringBuilder
  • 멀티 쓰레드 -StringBuffer

자원에서 데이터를 공유할 때
특정 쓰레드가 자기 자원을 쓸때까지 기다려주는 것 👉 동기화처리(Synchronized)

다형성 성립시 오버라이딩 가능 - 부모 클래스 메서드를 자식 클래스 에서 재정의 가능

String str1 = "java";
String str2 = new String("java");

String str3 = "java";
String str4 = new String("java");

1) if(str1 == str3)
문자를 == 비교시 주소를 비교하기 때문에 true/false 값으로 나온다

2) if(str1.equals(str3))

생성하지 않고 값을 할당한 것인지 확인하고
값이 다르면 객체를 만들지만, 값이 같으면 같은 객체를 가르킴

new 키워드로 객체 생성한 것은 값이 똑같더라도 무조건 새로운 객체로 생성 (주소값 동일)


제한자

접근제한자 - public > protected > > private
기타 -static, final, abstract

final

전역변수라고 하더라도 자동초기화가 되지 않기 때문에 초기값 필수.
1) variable
- 변수 앞에 final이 오면 상수
- 값 변경 불가, 상수는 모두 대문자로 표현(권장)
- final 필드 : final int i = 0; //사용자 임의대로 적절하게 선언해서 사용
- 상수 : static final int PI = 3.14; //한번 정해진 값 변경 불가능. 고정값
- static은 값이 딱 정해짐. 객체 생성 없이 메모리에 올라감.
- static final은 생성자에서 값 초기화 불가(생성자 진입 불가)
2) Method
- method 앞에 오면 overriding(재정의) 불가

public fianl void aa(){} 

3) class
- class 앞에 오면 상속 안됨
- 객체 생성은 가능

final class Test{} 

Quiz

Q1) A 클래스가 다음과 같이 정의되어있다. 올바른 설명은? (정답 : 4번)

public final class A{}

1) 객체를 생성할수 없다.
2) final멤버 변수만 가질 수 있다.
3) A a = new A()로 객체를 생성하면 a변수에 다시 A객체를 생성할 수 없다.
4) A 클래스를 상속받는 다른 클래스를 만들 수 없다.

abstract(추상화) ↔ 구체화

추상화 된 코드를 구체화 시키기 위한 용도로 사용
1) variable
- 변수 앞에 올 수 없음
2) Method
- method 앞에 abstract 붙으면 선언부만 있고 구현부(body) 없다.(기능 없음)
- ex) public abstract void aa(); 👉 ; 서브 클래스 에서 재정의 하기 위해 존재
- abstract method를 가지고 있는 class는 반드시 abstract class로 선언해야 한다.
3) class
- abstract class는 생성할 수 없다. (new 사용 안됨)
- 다른 class의 부모(Super)가 되기 위해 존재
- abstract 메소드를 가지고 있는 클래스를 상속받게 되면
자식클래스는 부모쪽에 정의되어있는 abstract 메소드를 재정의(구체화) 해야한다.
재정의를 안하면 자식 클래스는 abstract이 되어야 하며 객체를 생성할 수 없다.

public abstract class Remote{
	public abstract void on();
  	public abstract void off();
   	public abstract void pause();
   
}
//부모클래스가 abstract method이기 때문에 abstract method 재정의
public LgRemote extends Remote{
	public void on();
   public void off();
   public void pause();
   
}
public SamsungRemote extends Remote{
	public void on();
   public void off();
   public void pause();
   
}

사용시

Remote re = new LgRemote();
re.on();
re.off();
re.pause();

re = new SamsungRemote();
re.on();
re.off();
re.pause();

구체화된 객체는 왼쪽에 온 객체 타입이 부모타입이어야 다형성 이용 가능

profile
Just Do IT ------- 🏃‍♀️

0개의 댓글