JavaRush /Java Blog /Random-KO /커피 브레이크 #116. Java에서 함수 포인터를 사용하는 방법. indexOf in Java - J...

커피 브레이크 #116. Java에서 함수 포인터를 사용하는 방법. indexOf in Java - Java에서 문자열의 인덱스를 찾는 방법

Random-KO 그룹에 게시되었습니다

Java에서 함수 포인터를 사용하는 방법

출처: Dev.to 포인터는 메모리 주소를 저장하는 개체이며 값을 전달하는 대신 대상 개체, 배열 또는 변수 주소를 직접 가리켜 메모리를 절약할 수 있습니다. 불행하게도 Java에는 포인터에 대한 "실제" 개념이 없습니다. 그러나 다행스럽게도 실제에 가까운 메서드 참조를 사용하는 해결 방법이 있습니다. 커피 브레이크 #116.  Java에서 함수 포인터를 사용하는 방법.  indexOf in Java - Java에서 문자열의 인덱스를 찾는 방법 - 1

함수 포인터

함수 포인터는 함수의 주소를 가리키는 포인터입니다. 일부 사용 사례에는 실행에 따라 다른 함수를 호출하는 함수를 생성하여 콜백 루틴을 생성하거나 동적으로 호출되는 메서드에 대한 함수 포인터 배열을 저장하는 것(예: 에뮬레이터에 대한 프로세서 명령 저장)이 포함됩니다.

함수 포인터 시뮬레이션

메서드 참조에는 네 가지 유형이 있습니다 . 특정 객체의 인스턴스 메소드를 참조하는 유형을 사용합니다. 가리키는 메서드의 서명을 정의하는 인터페이스를 정의하는 것부터 시작해 보겠습니다.

// Wrapping interface
private interface FunctionPointer {
  // Method signatures of pointed method
  void methodSignature(int a);
}
그런 다음 대상 메서드의 시그니처를 사용하여 메서드를 생성합니다.

public void method1(int b) {
  System.out.println("Called method1 with integer " + b);
}

public void method2(int v) {
  System.out.println("Called method2 with integer " + v);
}

public void method3(int a) {
  System.out.println("Called method3 with integer " + a);
}
다음 단계는 래퍼 인터페이스 변수를 생성하고 여기에 메서드를 할당하는 것입니다. 변수는 저장되거나 실행될 함수에 대한 포인터 역할을 합니다.

// Create a variable of the interface and assign
// the method references
FunctionPointer pointer1 = this::method1;
FunctionPointer pointer2 = this::method2;

// Call both methods using their "pointer"
pointer1.methodSignature(3);
pointer2.methodSignature(2);

// Reassign and call pointer 1
pointer1 = this::method3;

pointer1.methodSignature(5);
정수 3으로 method1을 호출했습니다. 정수 2로 method2를 호출했습니다. 정수 5로 method3을 호출했습니다.

람다 표현식 사용

메서드 참조는 람다 식을 사용하여 할당할 수 있습니다.

// Create a method reference and assign a methods using a lambda.
FunctionPointer pointer1 =
  (a) -> System.out.println("Called pointer1 with int " + a);

FunctionPointer pointer2 =
  (b) -> System.out.println("Called pointer2 with int " + b);

함수 포인터 배열

래퍼 인터페이스 배열을 생성하여 메서드 참조 배열의 기능을 에뮬레이트할 수 있습니다.

// Create an array of "pointers"
FunctionPointer[] functionPointersArray = new FunctionPointer[3];

// Assign methods
functionPointersArray[0] = this::method1;
functionPointersArray[1] = this::method2;
functionPointersArray[2] = this::method3;

// Call methods    
functionPointersArray[0].methodSignature(3);
functionPointersArray[1].methodSignature(4);
functionPointersArray[2].methodSignature(5);

함수 포인터 vs 직접 호출

두 옵션을 모두 비교해 보면 메서드를 직접 호출하는 것이 메서드 참조를 사용하는 것보다 거의 5배 빠릅니다. 이는 모두 저장된 메서드와 비교하여 람다 식을 호출하는 추가 단계 때문입니다. 그러나 아마도 1년 안에 성능 저하를 느끼지 못할 것이므로 걱정하지 마십시오.

결론

포인터는 값이 아닌 객체의 주소를 직접 가리키는 변수입니다. 함수 포인터는 함수 주소를 직접 가리키므로 메모리 소비를 줄일 수 있습니다. Java에는 포인터가 없지만 메서드 참조나 람다 식을 사용하여 동작을 에뮬레이트할 수 있습니다. 메서드 참조를 사용하는 것은 메서드를 직접 호출하는 것보다 느리지만 이것이 사용을 방해하지는 않습니다.

indexOf in Java - Java에서 문자열의 인덱스를 찾는 방법

출처: FreeCodeCamp 문자열은 큰따옴표로 묶인 문자 집합입니다. indexOf 메소드는 문자열에서 지정된 문자 또는 하위 문자열의 인덱스 위치를 반환합니다. 이 기사에서는 다양한 indexOf 메소드 의 구문에 대해 알아봅니다 . 또한 Java 코드에서 문자 또는 하위 문자열의 인덱스 검색을 이해하고 효과적으로 사용하는 데 도움이 되는 예제도 살펴보겠습니다. 커피 브레이크 #116.  Java에서 함수 포인터를 사용하는 방법.  indexOf in Java - Java에서 문자열의 인덱스를 찾는 방법 - 2

indexOf 메소드의 구문

indexOf 메소드에는 다음과 같은 메소드가 있습니다.

public int indexOf(int char)
public int indexOf(int char, int fromIndex)
public int indexOf(String str)
public int indexOf(String str, int fromIndex)
다음 매개변수를 설명하겠습니다.
  • char은 한 줄에 한 문자를 나타냅니다.
  • fromIndex는 문자 또는 하위 문자열의 인덱스 검색이 시작되어야 하는 위치를 지정합니다. 이는 문자열에 동일한 값을 갖는 두 개의 문자/문자열이 있는 경우 중요합니다. 이 매개변수를 사용하면 indexOf 메소드에 시작할 위치를 알려줄 수 있습니다 .
  • str은 문자열의 하위 문자열을 나타냅니다.
아직 작동 방식을 이해하지 못하더라도 걱정하지 마세요. 예제를 보면 모든 것이 명확해질 것입니다!

Java에서 indexOf 메소드를 사용하는 방법

첫 번째 예에서는 문자열에서 한 문자의 인덱스를 찾습니다. 이는 public int indexOf(int char) 메소드를 이해하는 데 도움이 됩니다 .

IndexOf(int Char) 메서드 예


public class Main {
  public static void main(String[] args) {
    String greetings = "Hello World";
    
    System.out.println(greetings.indexOf("o"));
    
    // 4
  }
}
위의 코드에서는 문자 "o"의 인덱스가 4로 반환되었습니다. 문자 "o"가 두 개 있지만 첫 번째 문자의 인덱스만 반환되었습니다. 다음 예에서는 두 번째 "o"의 인덱스를 반환하는 방법을 살펴보겠습니다. 시퀀스 번호를 얻는 방법이 궁금하다면 문자열의 첫 번째 문자의 인덱스는 0이고 두 번째 문자의 인덱스는 1이라는 것을 알 수 있습니다.

indexOf(int Char, Int fromIndex) 메소드의 예

다음은 int indexOf(int char, int fromIndex) 메소드를 설명하는 예입니다 .

public class Main {
  public static void main(String[] args) {
    String greetings = "Hello World";
    
    System.out.println(greetings.indexOf("o", 5));
    
    // 7
  }
}
위의 예에서는 indexOf 메서드 에 다섯 번째 인덱스에서 작업을 시작하도록 지시합니다. H => 인덱스 0 e => 인덱스 1 l => 인덱스 2 l => 인덱스 3 0 => 인덱스 4 인덱스 5는 “W” 문자가 아닙니다. 다섯 번째 인덱스는 “Hello”와 “World” 사이의 공백입니다. 따라서 이 코드에서는 다섯 번째 인덱스 앞의 다른 모든 문자가 무시됩니다. 두 번째 문자 "o"의 인덱스로 7이 반환됩니다.

Int indexOf(String Str) 메소드의 예

다음 예에서는 하위 문자열의 인덱스를 반환하는 public int indexOf(String str) 메서드가 어떻게 작동하는지 이해합니다.

public class Main {
  public static void main(String[] args) {
    String motivation = "Coding can be difficult but don't give up";
    
    System.out.println(motivation.indexOf("be"));
    
    // 11
  }
}
어떻게 11을 돌려받았는지 궁금합니다. 인덱스가 계산되는 방식과 하위 문자열 사이의 공백도 인덱스로 간주되는 방식을 이해하려면 마지막 섹션을 검토해야 합니다. 하위 문자열이 매개 변수로 전달되면 반환되는 인덱스는 하위 문자열의 첫 번째 문자 인덱스입니다. 11은 문자 "b"의 인덱스입니다.

indexOf(String Str, Int fromIndex) 메소드의 예

마지막 메소드는 public int indexOf(String str, int fromIndex) - public int indexOf(int char, int fromIndex) 메소드 와 동일합니다 . 지정된 위치의 인덱스를 반환합니다.

public class Main {
  public static void main(String[] args) {
    String motivation = "The for loop is used for the following";
    
    System.out.println(motivation.indexOf("for", 5));
    
    // 21
  }
}
이 예에서는 메서드가 첫 번째 하위 문자열 다음에 오는 다섯 번째 인덱스에서 작업을 시작하도록 지정했습니다. 21은 for의 두 번째 하위 문자열 인덱스입니다. 마지막으로 문자열에 없는 문자나 하위 문자열을 전달하면 indexOf 메서드는 -1을 반환합니다. 예는 다음과 같습니다.

public class Main {
  public static void main(String[] args) {
    String motivation = "The for loop is used for the following";
    
    System.out.println(motivation.indexOf("code"));
    
    // -1
  }
}

결론

이 기사에서는 명확한 예와 함께 네 가지 indexOf 메소드를 사용하는 방법을 배웠습니다 . 또한 각 메서드의 구문이 어떻게 생겼는지, 인덱스에 반환을 지시하는 방법도 살펴보았습니다. 또한, 존재하지 않는 문자나 부분 문자열이 매개변수로 전달되면 어떤 일이 발생하는지 확인할 수 있었습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION