🔮
method naming 에서 of 와 from 의 차이는 뭘까?
November 09, 2021
of 와 from 의미가 뭘까?
문득 코딩을 하다 궁금해졌습니다.
메소드의 이름으로 사용되는 of 와 from 의 의미에 대해서 알고 싶어졌습니다.
구글 검색결과
oracle - java documentation
stackoverflow
등등 에서 정보를 찾을 수 있었습니다.
오라글 문서에서 정의하는 메소드 네이밍 컨벤션은 아래와 같습니다.
Prefix | Method Type | Use |
---|---|---|
of | static factory | 팩토리가 주로 입력 매개변수의 유효성을 검사하고 변환하지 않는 인스턴스를 만듭니다. |
from | static factory | 입력 매개변수를 대상 클래스의 인스턴스로 변환합니다. 이 경우 입력에서 정보가 손실될 수 있습니다. |
parse | static factory | 입력 문자열을 구문 분석하여 대상 클래스의 인스턴스를 생성합니다. |
format | instance | 지정된 포맷터를 사용하여 임시 개체의 값을 형식화하여 문자열을 생성합니다. |
get | instance | 대상 객체 상태의 일부를 반환합니다. |
is | instance | 대상 개체의 상태를 쿼리합니다. |
with | instance | 한 요소가 변경된 대상 개체의 복사본을 반환합니다. 이것은 JavaBean 의 set 메소드와 동일한 불변입니다. |
plus | instance | 시간이 추가된 대상 개체의 복사본을 반환합니다. |
minus | instance | 시간을 뺀 대상 개체의 복사본을 반환합니다. |
to | instance | 이 개체를 다른 유형으로 변환합니다. |
at | instance | 이 개체를 다른 개체와 결합합니다. |
of, from 뿐만 아니라 다른 네이밍 컨벤션도 궁금했는데 갓 오라클이네요 ^^ (구글 번역기로 나온 번역이라.. 정확한 정보는 위 링크 참고해주세요.)
이해한걸 바탕으로 예제로 알아보기
// 예시로 사용될 클래스 입니다.
class StringArray {
private final List<String> stringArray;
private StringArray(List<String> array) {
this.stringArray = array;
}
public static StringArray of(int... ints) {
return new StringArray(Arrays.stream(ints).mapToObj(String::valueOf).collect(Collectors.toList()));
}
public static StringArray from(String str, String delimiter) {
return new StringArray(List.of(str.split(delimiter)));
}
@Override
public String toString() {
return stringArray.toString();
}
}
예시로 좀 더 탐구해봤습니다.
@Test
void method_naming_conventions() {
// of (static factory)
// str1.{index}Of({arg}) -> str1 의 {arg} 값의 index 를 줘
String str1 = "123456";
System.out.println(str1.indexOf("1")); // 0
System.out.println(str1.indexOf("2")); // 1
// {StringArray}.of({arg}); -> {arg} 를 검증해서 {StringArray} 인스턴스를 줘
StringArray of = StringArray.of(1, 2, 3, 4, 5, 6);
System.out.println(of.toString()); // [1, 2, 3, 4, 5, 6]
// from (static factory)
// {StringArray}.from({arg}) -> {arg} 를 변경해서 {StringArray} 인스턴스 를 줘
StringArray from = StringArray.from("1,2,3,4,5,6", ":");
System.out.println(from.toString()); // [1,2,3,4,5,6]
// parse (static factory)
// {Integer}.parseInt({arg}) -> {arg} 를 Int 로 parse 해줘
int parseInt = Integer.parseInt("1");
System.out.println(parseInt); // 1
// format (instance)
// {String}.format({arg}) -> {arg}를 포맷팅해서 {String} 으로 줘
String stringFormat = String.format("%s 포맷팅합니다.", "문자열");
System.out.println(stringFormat); // "문자열 포맷팅합니다."
// get (instance)
// {instance}.get({arg}) -> {instance} 의 {arg} 번째 데이터를 줘
List<String> stringList = new ArrayList<>();
stringList.add("첫번째 String");
stringList.add("두번째 String");
System.out.println(stringList.get(0)); // "안녕 String"
// is (instance)
// {instance}.is{Status}() -> {instance} 가 {Status} 이냐? 맞으면 true , 틀리면 false
String empty = "";
System.out.println(empty.isEmpty()); // true
// to (instance)
// {number}.to{String} -> {number} 를 {String} 으로 변환해줘
Integer number = 1234;
System.out.println(number.toString()); // "1234"
// at (instance)
// str.{char}At(arg) -> str 의 {arg} index 의 값을 {char} 로 반환해줘
String str = "adasd";
System.out.println(str.charAt(1));
}