JavaRush /Java Blog /Random-KO /커피 브레이크 #133. Java에서 배열의 일부만 가져오는 방법. Java의 인터페이스 및 추상 클래...

커피 브레이크 #133. Java에서 배열의 일부만 가져오는 방법. Java의 인터페이스 및 추상 클래스

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

Java에서 배열의 일부만 얻는 방법

출처: Asyncq 배열의 일부를 복사하는 것은 모든 개발자가 접하는 매우 일반적인 작업입니다. 이 기사에서는 람다 식과 스트리밍 API를 사용하는 전통적인 명령형 스타일과 현대적인 선언적 스타일 코드를 살펴보겠습니다. 커피 브레이크 #133.  Java에서 배열의 일부만 가져오는 방법.  Java의 인터페이스 및 추상 클래스 - 1

필수 접근 방식

명령형 프로그래밍 스타일은 오랫동안 Java에서 일반적이었습니다. 따라서 Java 개발자가 원본 배열의 특정 부분을 복사하기 위해 아래 코드를 작성하는 것은 당연합니다. 이렇게 하려면 요소를 반복하면서 필요한 요소만 필터링하고 최종 배열에 작성하면 됩니다.
private static int[] copyArray(){
       int[] numbers = {1,2,3,4,5,6,7};
       int[] subArray = new int[numbers.length-3];
       int j =3;
       for (int i=0;i<subArray.length;i++){
           subArray[i] = numbers[j+i];
       }
       System.out.println(Arrays.toString(subArray));
       return subArray;
   }
우리 중 많은 사람들은 Java Arrays 라이브러리 에 편리한 copyOfRange 메소드가 있다는 사실을 종종 잊어버립니다 . 이 메서드는 인덱스에 전달하거나 인덱스에서 배열의 일부를 복사하는 데 사용할 수 있습니다.
private static int[] copyArray1(){
  int[] numbers = {1,2,3,4,5,6,7};
  int[] subArray = Arrays.copyOfRange(numbers,3,numbers.length);
  System.out.println(Arrays.toString(subArray));
  return subArray;
}

선언적 접근 방식

Java 8부터 Streams API를 사용하여 배열의 일부를 복사할 수 있습니다. 아래 코드에서는 int[]를 전달 하고 3보다 큰 값만 필터링하여 마지막으로 배열에 복사할 수 있습니다.
private static void copyArray2(){
        int[] numbers = {1,2,3,4,5,6,7};
        // copy with values
        int[] subArray = Arrays.stream(numbers).filter(a-> a>3).toArray();
        System.out.println(Arrays.toString(subArray));
    }
위 코드는 배열 일부의 값 기반 복사본이지만 인덱스를 기반으로 복사할 수도 있습니다. 코드 아래에서는 i=0에서 Intstream을 브로드캐스트합니다. i=len(배열) . 일반적으로 명령형 코드에서는 시작 인덱스부터 끝 인덱스까지 for 루프 를 작성 하고 각 요소를 반복합니다. Intstream을 사용하여 동일한 작업을 수행하고 인덱스 요소에 액세스할 수 있습니다 .
// copy with index
int[] subArray1 = IntStream
                .range(0, numbers.length)
                .filter(i -> i > 3)
                .map(a->numbers[a]).toArray();

System.out.println(Arrays.toString(subArray1));
위의 방법이 작동하는 동안 AtomicInteger를 사용하여 배열의 일부를 복사할 수 있는 다른 방법이 있습니다 . 기본적으로 인덱스를 제공하고 이를 1씩 증가시키는 getAndIncrement 메서드가 있습니다 .
// copy with index
AtomicInteger atomicInteger = new AtomicInteger();
int[] subArray2 = Arrays.stream(numbers).filter(i -> atomicInteger.getAndIncrement() > 3).toArray();
System.out.println(Arrays.toString(subArray2));

결론

이 기사에서는 명령형 및 선언적 스타일을 사용하여 Java 배열의 일부를 복사하는 방법에 대해 설명했습니다. 나는 코드를 더 읽기 쉽고 덜 장황하게 만드는 선언적 스타일로 작업하는 것을 선호합니다.

Java의 인터페이스 및 추상 클래스

출처: Devgenius Java 언어를 배울 때 확실히 인터페이스라는 개념을 접하게 됩니다. 인터페이스는 Java의 주요 기능 중 하나이므로 모든 개발자는 인터페이스 사용 방법을 알아야 합니다. 인터페이스에는 장점과 단점이 모두 있다는 점을 기억하는 것이 중요합니다. 인터페이스 이해에 대해 더 자세히 살펴보겠습니다. 인터페이스를 구현할 때 추상 클래스를 만나게 됩니다. 추상 클래스란 무엇입니까? 그들은 무엇을 위해 필요합니까? 인터페이스란 무엇입니까? 어떻게 사용되나요? 인터페이스가 추상 클래스를 사용하는 이유는 무엇입니까? 이 기사에서 이러한 모든 질문에 대한 답을 얻을 수 있습니다. 커피 브레이크 #133.  Java에서 배열의 일부만 가져오는 방법.  Java의 인터페이스 및 추상 클래스 - 2

인터페이스란 무엇입니까?

인터페이스는 동작을 설명하고 추상화를 달성하는 데 도움이 되는 Java의 특수 메커니즘입니다. 정적 상수와 추상 메서드를 갖고 있다는 점에서 여러 면에서 클래스와 유사합니다. 인터페이스에는 추상 메서드(본문이 없는 메서드)만 있을 수 있습니다. 인터페이스와 추상 클래스의 간단한 차이점:
  • 인터페이스에는 구현된 메소드 없으며 모두 공개되어 있고 클래스 변수가 없습니다.
  • 추상 클래스는 하나 이상의 메서드가 구현되지 않은 클래스입니다.
Java 9부터는 인터페이스에서 private , defaultstatic 메소드를 사용할 수도 있습니다 . 이제 추상화를 달성하는 데 사용되는 간단한 인터페이스 논리로 넘어가겠습니다.

추상화란 무엇입니까?

실제 사례를 들어보겠습니다. 우리 모두는 휴대폰에서 앱을 사용합니다. 어떤 애플리케이션을 사용하고 싶을 때마다 그 애플리케이션에 계정을 만들어야 합니다. 전화번호를 통해 등록하면 일회용 비밀번호가 휴대폰으로 전송됩니다. 우리는 애플리케이션에서 “Get Password” 버튼을 클릭하면 비밀번호가 수신된다는 것을 알고 있지만, 이 시스템이 백엔드에서 어떻게 작동하는지, 그리고 버튼을 클릭한 후 실제로 어떤 일이 일어나는지는 알 수 없습니다. 이제 백엔드에서 실제로 무슨 일이 일어나고 있는지 사용자에게 보여주지 않고 작업을 성공적으로 완료하는 프로세스를 추상화라고 합니다. Java에서는 인터페이스와 추상 클래스를 사용하여 추상화를 달성할 수 있습니다.

인터페이스를 사용하는 이유는 무엇입니까?

인터페이스를 사용하는 세 가지 이유는 다음과 같습니다.
  • 추상화를 달성하기 위해.
  • 다중 상속 기능을 지원합니다.
  • 느슨한 결합을 달성하기 위해.

인터페이스를 사용하는 방법?

인터페이스는 인터페이스 키워드를 사용하여 선언됩니다 . 이는 추상화를 제공합니다. 즉, 클래스의 구조를 선언합니다. 인터페이스의 모든 메서드는 추상 메서드이며 기본적으로 public, static 및 final로 설정됩니다( public , static , final ). 인터페이스를 구현하는 클래스는 무엇이든 인터페이스에 선언된 모든 메서드를 구현해야 합니다.
interface <interface_name>{

     // declare constant fields
     // declare methods that abstract
     // by default.
 }
인터페이스 추상화와 유사하게 추상 클래스를 사용하여 추상화를 달성할 수도 있습니다.

추상 클래스란 무엇입니까?

추상 클래스는 앞에 abstract 키워드가 있는 클래스입니다 . 여기에는 추상 메서드와 구체적인 메서드(본문 포함)가 모두 포함되어 있습니다. 추상 클래스는 인스턴스화할 수 없으며 확장해야 하며 해당 메서드를 구현해야 합니다. 추상 클래스는 동작뿐만 아니라 일부 추상 개체(자동차, 사람 등)를 설명합니다. 기억하다:
  • 추상 클래스는 abstract 키워드를 사용하여 선언해야 합니다 .
  • 추상적인 방법과 비추상적인 방법이 있을 수 있습니다.
  • 추상 클래스의 인스턴스를 만들 수 없습니다.
  • 생성자와 정적 메서드를 가질 수 있습니다.
  • 하위 클래스가 메서드 본문을 변경하지 않도록 하는 최종 메서드를 가질 수 있습니다.
추상 메소드가 있는 추상 클래스의 예: 이 예에서 Bike는 실행되는 추상 메소드가 하나만 포함된 추상 클래스입니다. 구현은 Honda 클래스 에서 제공됩니다 .
abstract class Bike{
  abstract void run();
}
class Honda4 extends Bike{
void run(){System.out.println("running safely");}
public static void main(String args[]){
 Bike obj = new Honda4();
 obj.run();
}
}
생성자, 데이터 멤버 및 메서드가 있는 추상 클래스: 추상 클래스에는 데이터 멤버, 추상 메서드, 메서드 본문(비추상 메서드), 생성자 및 심지어 main () 메서드도 포함될 수 있습니다 .
//Example of an abstract class that has abstract and non-abstract methods
 abstract class Bike{
   Bike(){System.out.println("bike is created");}
   abstract void run();
   void changeGear(){System.out.println("gear changed");}
 }
//Creating a Child class which inherits Abstract class
 class Honda extends Bike{
 void run(){System.out.println("running safely..");}
 }
//Creating a Test class which calls abstract and non-abstract methods
 class TestAbstraction2{
 public static void main(String args[]){
  Bike obj = new Honda();
  obj.run();
  obj.changeGear();
}
}
이제 주요 질문이 발생합니다. 인터페이스와 추상 클래스가 추상화에 도움이 된다면 어느 것을 사용하는 것이 더 낫습니까? 대답은 Java가 C++처럼 다중 상속을 지원하지 않는다는 것입니다. 즉, 다중 상속이 필요하다면 인터페이스를 사용해야 합니다. 즉, 추상 클래스는 1~100%의 사례에 도움이 되고, 인터페이스는 100%의 사례에 도움이 됩니다. 동작이 필요하면 인터페이스를 사용해야 합니다. 개념적 객체에 대해 이야기하고 있다면 추상 클래스를 사용해야 합니다.

Java 인터페이스 예

이 예에서 Drawable 인터페이스 에는 메서드가 하나만 있습니다. 구현은 RectangleCircle 클래스 에 의해 제공됩니다 . 실제 시나리오에서는 인터페이스가 다른 사람에 의해 정의되고 해당 구현은 다른 구현 공급자에 의해 제공됩니다. 게다가 다른 사람이 사용하고 있습니다. 인터페이스를 사용하는 사용자는 구현의 일부를 숨깁니다.
//Interface declaration: by first user
interface Drawable{
void draw();
}
//Implementation: by second user
class Rectangle implements Drawable{
public void draw(){System.out.println("drawing rectangle");}
}
class Circle implements Drawable{
public void draw(){System.out.println("drawing circle");}
}
//Using interface: by third user
class TestInterface1{
public static void main(String args[]){
Drawable d=new Circle();//In real scenario, object is provided by method e.g. getDrawable()
d.draw();
}}

인터페이스를 사용한 Java의 다중 상속

클래스가 여러 인터페이스를 구현하거나 인터페이스가 여러 인터페이스를 확장하는 경우 이를 다중 상속이라고 합니다.
interface Printable{
void print();
}
interface Showable{
void show();
}
class A7 implements Printable,Showable{
public void print(){System.out.println("Hello");}
public void show(){System.out.println("Welcome");}

public static void main(String args[]){
A7 obj = new A7();
obj.print();
obj.show();
 }
}
질문: 다중 상속은 Java의 클래스를 통해 지원되지 않지만 인터페이스를 통해 가능합니다. 이유는 무엇입니까? 상속 섹션에서 이미 설명했듯이 클래스 예제에서는 모호성으로 인해 다중 상속이 지원되지 않습니다. 그러나 인터페이스 예제에서는 모호성이 없기 때문에 이를 지원합니다. 그 이유는 구현이 구현 클래스에 의해 제공되기 때문입니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION