제너릭, 열거형, 문자열 조작

허준호·2025년 6월 27일
0

dart 언어 공부

목록 보기
8/16
post-thumbnail

제너릭

다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시 타입 체크를 해주는 기능이다

ex) List class, Map<K, V> class

장점

  • 타입 안정성을 제공한다
  • 타입 체크와 형변환을 생략할 수 있으므로 코드가 간결해진다

타입이 없을때의 문제점

  • 런타임 에러가 나기 쉽다
  • IDE가 컴파일 에러를 미리 찾을 수 없다

예시

class Pocket<E> {
	E? _data;
	
	void put(E data) {
	 _data = data;
	}
	
	E? get() {
	 return _data;
	}
}
  • 제너릭 타입 뒤에 클래스를 상속받으면 해당 클래스를 상속받는 서브클래스들로만 타입지정이 가능하다

열거형(enum)

정해 둔 값만 넣어둘 수 있는 타입

특징

  • switch문과의 조합으로 모든 처리를 강제할 수 있다
  • if-else문은 선택처리 가능

문자열 조작

문자열 결합

ex) ‘Hello’ + ‘ Dart’ ⇒ ‘Hello Dart’

  • ${수식}을 활용한 문자열 결합
'${3 + 2}' // '5'
'${'word'.toUpperCase()}' // WORD
'$myObject' // The value of myObject.toString()

그 외 메소드

String.subString(시작인덱스, 문자개수) // 떼어내기

String.replaceAll(기존 문자열, 변경 문자열) // 치환

String.split(구분자) // 분리

String.toLowerCase() // 소문자

String.toUpperCase() // 대문자

String.indexOf(문자열) ⇒ 해당 문자열의 위치 반환

String.lastIndexOf(문자열) // 가장 뒤에 있는 문자의 위치 반환

String.length // 길이

String.isEmpty < = > String.isNotEmpty // 빈값 확인

String.contains(문자열) // 포함여부 확인

String.endsWith(문자열) // 끝나는 단어가 맞는지 확인

String.trim() // 좌우 공백 제거

String Buffer

write() 메서드로 결합한 결과를 내부 메모리(버퍼)에 담아 두고 toString()으로 결과를 얻음

final buffer = StringBuffer('Dart');

buffer
	..write(' and ')
	..write('Flutter');

print(buffer.toString());

.. (cascade) 연산자 : void 리턴인 함수의 앞에 사용하면 해당 객체의 레퍼런스를 반환하여 메서드 체인을 사용할 수 있음

String Buffer의 장점

  • String 인스턴스는 불변 객체(immutable)
  • 새로운 인스턴스 생성은 비용이 많이 든다
  • 문자열 연산보다 속도가 빠르다

String 인스턴스 비교

void main() {
	String str1 = 'hello';
	String str2 = 'hello';
	print(identical(str1, str2)) // 1번
	
	String str3 = String.fromCharCodes('hello'.codeUnits);
	print(identical(str1, str3)) // 2번
	 
	String str4 = 'hel' + 'lo';
	print(identical(str1, str4)); // 3번
	
	String str5 = 'hel' + getLo();
	print(identical(str1, str5)); // 4번
}

String getLo() {
 return 'lo';
}
  • String은 생성 시 String pool이라는 메모리 공간에 자리잡고 이후에 같은 값 사용 시 추가로 생성하지 않고 기존에 저장되어 있는 문자열을 참조한다. 따라서 1번은 true
  • String.fromCharCodes()는 새로운 문자열 객체를 생성하기 때문에 메모리 주소가 str1과 다르다. 따라서 2번은 false
  • ‘hel’ + ‘lo’는 컴파일 타임에 ‘hello’로 변환되어 상수 폴딩이 발생한다. 즉, ‘hello’와 동일한 객체가 되므로 str1과 같은 메모리 주소를 공유한다. 따라서 3번은 true
  • ‘hel’ + getLo()는 런타임에 문자열 연산이 수행된다. str1과 다른 메모리 주소를 가지므로 4번은 false이다
profile
후추랑 소금 좋아하는 개발자

0개의 댓글