본문 바로가기

컴퓨터공부/Java

[java 자바공부] 스트림과 람다 인스턴스 메소드, 정적 메소드, 동적 메소드, 코딩테스트 공부

by Life & study 2023. 12. 21.
반응형

[java 자바공부] 스트림과 람다 인스턴스 메소드, 정적 메소드, 동적 메소드

 

[java 자바공부] 스트림과 람다

 

 

IntStream filter(IntPredicate predicate)
일치하는 이 스트림의 요소로 구성된 스트림을 반환합니다. 주어진 술어.



predicate
1.술부, 술어(cf. SUBJECT)2.빈사(賓辭)3.술부[술어]의4.단정하는, 서술하는5.단정[단언]하다(affirm), 선언[공언]하다6.속성을 나타내다 ((about, of)); <어떤 근거에> 입각시키다(found), (말·행위 따위의) 기초를 두다 ((on, upon))

암시하다, 내포하다, 함축하다
Her apology predicates a change of attitude. 

그녀의 사과는 태도의 변화를 내포하고 있다.

dicate 지시하는



IntStream.range(0, dogs.length): 0부터 dogs.length - 1까지의 숫자 스트림을 생성합니다.



filter(i -> stonefor1(stone, dogs[i])): 각 개에 대한 stonefor1 메서드의 결과가 true인 경우만 필터링합니다. 즉, 돌다리를 건널 수 있는 개만 남습니다.

filter를 쓰고

public static boolean 메소드 stonefor1 (param) {

}​


map 은 인덱스이며 Obj 는 오브젝트의 이름명이다




✨Q. !
public static boolean stonefor1(int[] stone, Dog dogs) {, public static void solution(int[] stoneweight1, Dog[] dogs) {,에서 int[] stone 와 int[] stoneweight1의 역할은 무엇인가?


int[] stone과 int[] stoneweight1은 모두 돌다리의 각 돌의 내구성을 나타내는 정수 배열입니다.

int[] stoneweight1은 solution 메서드의 입력으로 주어지며, 이는 원래 돌다리의 각 돌의 내구성을 나타냅니다.
int[] stone은 stoneweight1을 복사한 것으로, solution 메서드에서 개들이 돌다리를 건널 때마다 갱신됩니다. 즉, 개가 돌에 뛰어오를 때마다 해당 돌의 내구성을 감소시키는데, 이 감소된 내구성 정보는 stone 배열에 반영됩니다.
따라서, stoneweight1은 원래 돌다리의 상태를 저장하고, stone은 개들이 돌다리를 건너면서 변경되는 돌다리의 상태를 저장하는 역할을 합니다.



int[] 첫번째위치와 int[] 두번째위치는 메서드의 인자로, 각각 stonefor1 메서드와 solution 메서드에 전달되는 배열을 나타냅니다. 이들은 메서드 내에서 사용하는 매개변수의 이름을 변경한 것입니다.

int[] 첫번째위치는 stonefor1 메서드에 전달되는 배열을 나타냅니다. 이는 돌다리의 각 돌의 내구성을 나타내는 정수 배열입니다. stonefor1 메서드 내에서 이 배열은 개가 돌다리를 건널 때마다 갱신됩니다. 개가 돌에 뛰어오를 때마다 해당 돌의 내구성을 감소시키는데, 이 감소된 내구성 정보는 첫번째위치 배열에 반영됩니다.
java
public static boolean stonefor1(int[] 첫번째위치, Dog dogs) {
    int jumpStart = dogs.jump - 1;
    for (int j = jumpStart; j < 첫번째위치.length; j += dogs.jump) {
        첫번째위치[j] -= dogs.weight;
        if (첫번째위치[j] < 0)
            return false;
    }
    return true;
}​

int[] 두번째위치는 solution 메서드에 전달되는 배열을 나타냅니다. 이는 원래 돌다리의 각 돌의 내구성을 나타냅니다. solution 메서드에서 이 배열은 복사되어 개들이 돌다리를 건너는 동안 변경되는 돌다리의 상태를 저장합니다.

java
public static void solution(int[] 두번째위치, Dog[] dogs) {
    int[] stone = 두번째위치.clone();
    List<String> start = IntStream.range(0, dogs.length)
            .filter(i -> stonefor1(stone, dogs[i]))
            .mapToObj(i -> dogs[i].name)
            .collect(Collectors.toList());
    System.out.println("생존자:" + start);
}​

따라서, 첫번째위치와 두번째위치는 각각 개들이 돌다리를 건너는 동안 변경되는 돌다리의 상태와 원래 돌다리의 상태를 저장하는 역할을 합니다. 이들은 메서드의 매개변수이므로, 메서드를 호출할 때 이들의 값을 지정해주어야 합니다.







 

 

[java 자바공부] 람다와 스트림은 차이점은 무엇인가?

 

람다(Lambda):
 스트림(Stream):
람다(Lambda):
람다 표현식은 자바 8에서 도입된 기능으로, 이름 없는 함수를 만들어 특정 인터페이스에 대해 식별자 없이 함수를 바로 전달하거나 처리하는데 사용됩니다. 람다는 '매개 변수를 가진 코드 블록'이지만, 런타임 시에는 익명 구현 객체를 생성합니다. 람다는 주로 함수형 인터페이스(Functional Interface)의 인스턴스를 생성하는 데 사용됩니다.


**람다**

* `(매개변수) -> { 실행문 }`

  * 매개변수: 람다 함수가 받는 입력입니다.
  * 실행문: 람다 함수가 수행하는 작업입니다.

* 자주 쓰이는 문법:

  * `(매개변수) -> 매개변수`

    * 매개변수를 그대로 반환합니다.

  * `(매개변수1, 매개변수2) -> 매개변수1 + 매개변수2`

    * 두 매개변수를 더한 값을 반환합니다.

  * `(매개변수) -> { System.out.println(매개변수); }`

    * 매개변수를 출력합니다.

* 주석 코드 예시:

```java
// 숫자 목록을 정렬합니다.
List<Integer> numbers = Arrays.asList(1, 3, 2, 4, 5);
numbers.sort((a, b) -> a - b);

// 숫자의 합계를 계산합니다.
int sum = numbers.stream().reduce(0, (a, b) -> a + b);

// 숫자의 평균을 계산합니다.
double average = numbers.stream().reduce(0.0, (a, b) -> a + b) / numbers.size();

// 람다 함수를 사용하여 1에서 10까지의 숫자를 출력합니다.
IntStream.range(1, 11).forEach(System.out::println);​

```

스트림(Stream):
스트림은 자바 8에서 도입된 데이터 시퀀스를 처리하는 기능입니다. 컬렉션, 배열 등의 데이터 집합에 대해 병렬 처리를 쉽게 할 수 있도록 도와줍니다. 스트림을 사용하면 데이터를 효율적으로 처리(필터링, 맵핑, 정렬, 검색 등)할 수 있습니다. 스트림은 '데이터의 흐름'을 처리하는 모델이며, 주로 람다 표현식과 함께 사용되어 데이터 처리를 간결하고 효율적으로 수행합니다.
요약하자면, 람다는 '함수적인 처리'를 위한 코드를 간결하게 표현하는 방법이고, 스트림은 이러한 함수적인 처리를 이용해 데이터 집합을 효과적으로 처리하는 방법입니다. 람다와 스트림은 서로 다른 개념이지만, 함께 사용되어 자바에서 함수형 프로그래밍을 가능하게 합니다.


자바 스트림은 다양한 연산을 지원하며, 이들 중 일부는 다음과 같습니다.

filter(Predicate predicate): 주어진 조건에 일치하는 요소만을 포함하는 새로운 스트림을 반환합니다.

java
List<String> names = Arrays.asList("John", "Arya", "Sansa");
names.stream()
     .filter(name -> name.startsWith("A")) // "A"로 시작하는 이름만 필터링
     .forEach(System.out::println); // 출력: Arya
map(Function mapper): 각 요소를 주어진 함수를 통해 변환한 결과를 포함하는 새로운 스트림을 반환합니다.​

java
List<String> names = Arrays.asList("John", "Arya", "Sansa");
names.stream()
     .map(String::toUpperCase) // 모든 이름을 대문자로 변환
     .forEach(System.out::println); // 출력: JOHN, ARYA, SANSA
sorted(): 스트림의 요소를 기본 정렬 순서에 따라 정렬한 새로운 스트림을 반환합니다.​

java
List<String> names = Arrays.asList("John", "Arya", "Sansa");
names.stream()
     .sorted()
     .forEach(System.out::println); // 출력: Arya, John, Sansa
collect(Collector collector): 스트림의 요소를 수집하여 다른 형태로 반환합니다.​
java
List<String> names = Arrays.asList("John", "Arya", "Sansa");
List<String> uppercasedNames = names.stream()
                                    .map(String::toUpperCase)
                                    .collect(Collectors.toList()); // 대문자로 변환된 이름 리스트 반환
reduce(BinaryOperator accumulator): 스트림의 요소를 주어진 함수를 통해 누적하여 결과를 반환합니다.​
java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> sum = numbers.stream()
                               .reduce(Integer::sum); // 모든 숫자의 합 계산​

이 외에도 forEach, toArray, min, max, count, anyMatch, allMatch, noneMatch 등 다양한 연산이 있습니다. 이러한 연산들은 대부분 중간 연산(intermediate operation)과 최종 연산(terminal operation)으로 분류됩니다. 중간 연산은 필터링이나 맵핑처럼 스트림을 반환하며, 최종 연산은 스트림을 처리하여 결과를 반환하거나 사이드 이펙트를 발생시킵니다.



 

 

 

[java 자바공부] New 라는 것은 오른쪽에 씌여진다??

 

new` 키워드는 항상 오른쪽에 씌여집니다. `new` 키워드는 객체를 생성하는 데 사용되며, 객체의 클래스 이름은 `new` 키워드의 오른쪽에 위치합니다.

다음은 `new` 키워드를 사용하여 객체를 생성하는 예입니다.

```java
Dog dog = new Dog("씨-독", "72년생", 2, 1);
```



위의 코드에서 `new Dog(...)`는 `Dog` 클래스의 새로운 인스턴스를 생성합니다. `Dog` 클래스의 인스턴스는 `dog` 변수에 저장됩니다.

`new` 키워드는 항상 오른쪽에 씌여져야 합니다. 만약 `new` 키워드를 왼쪽에 씌우면 컴파일 오류가 발생합니다.

다음은 `new` 키워드를 왼쪽에 씌운 예입니다.

```java
new Dog dog = ("씨-독", "72년생", 2, 1);
```



위의 코드는 컴파일 오류가 발생합니다.

따라서 `new` 키워드는 항상 오른쪽에 씌워야 합니다. 

 

 

 

 

 

[java 자바공부] 인스턴스 메서드와
Dog의 클래스는 클래스의 인스턴스 이다

정적메서드 알아야된다

 

 

 

인스턴스 메서드와
Dog의 클래스는 클래스의 인스턴스 이다

정적메서드 알아야된다

main은 정적 메서드이다


 

 

클래스 객체

 

클래스 정의: Dog 클래스를 정의하였습니다. 클래스는 객체를 생성하기 위한 틀이며, 이 클래스는 name, age, jump, weight 등의 필드와 Dog 생성자, canSurvive 메소드를 가지고 있습니다.
객체 생성: Dog 클래스를 기반으로 여러 개의 Dog 객체를 생성하였습니다. 이를 통해 각각의 Dog 객체는 고유의 name, age, jump, weight 값을 가지게 됩니다.

 

인스턴스 메소드

canSurvive 메소드는 Dog 클래스의 인스턴스 메소드입니다. 이 메소드는 Dog 객체가 돌다리를 건널 수 있는지를 판단합니다. 인스턴스 메소드는 특정 객체의 상태를 변경하거나, 객체의 상태를 이용해 계산을 수행하는 등의 작업을 수행합니다.

 

정적 메소드

solution 메소드는 Main 클래스의 정적 메소드입니다. 이 메소드는 Dog 객체 목록을 입력받아, 돌다리를 건널 수 있는 Dog 객체의 이름을 출력합니다. 정적 메소드는 특정 객체에 속하지 않고, 클래스 전체에 속하는 메소드입니다.

 

 

 

 

[java 자바공부] 클래스와 인스턴스화란 무엇인가?

 

클래스와 인스턴스: 클래스는 객체를 만들기 위한 틀입니다. 예를 들어, Dog 클래스는 '강아지'라는 개념을 코드로 표현한 것입니다. 클래스를 기반으로 실제 객체를 만드는 것을 '인스턴스화'라고 합니다. 예를 들어, Dog 클래스를 인스턴스화하여 만든 Dog 객체는 '강아지'라는 개념을 실체화한 것입니다.
java
Dog myDog = new Dog("루비독", "95년생", 3, 4); // Dog 클래스를 인스턴스화

 


인스턴스 메소드: 인스턴스 메소드는 특정 객체에 속한 메소드입니다.

 

인스턴스 메소드: 인스턴스 메소드는 특정 객체에 속한 메소드입니다. 이 메소드는 객체의 필드를 사용하거나 변경할 수 있습니다.
java

public boolean canSurvive(int[] stone) {
    int jumpStart = this.jump - 1;
    for (int j = jumpStart; j < stone.length; j += this.jump) {
        stone[j] -= this.weight;
        if (stone[j] < 0)
            return false;
    }
    return true;
}


위의 canSurvive 메소드는 Dog 클래스의 인스턴스 메소드입니다. 이 메소드는 Dog 객체의 jump와 weight 필드를 사용하여 계산을 수행합니다.

 

정적 메소드: 정적 메소드는 클래스에 속한 메소드로, 특정 객체에 속하지 않습니다. 정적 메소드 내부에서는 인스턴스 필드나 인스턴스 메소드를 사용할 수 없습니다. main 메소드는 대표적인 정적 메소드입니다.
java
public static void main(String[] args) {
    int[] stoneWeight = {1, 2, 1, 4};
    List<Dog> dogs = new ArrayList<>();
    dogs.add(new Dog("씨-독", "72년생", 2, 1));
    dogs.add(new Dog("루비독", "95년생", 3, 4));
    dogs.add(new Dog("피치독", "95년생", 3, 3));
    dogs.add(new Dog("코볼독", "59년생", 1, 1));
    solution(stoneWeight, dogs);
}
위의 main 메소드는 Main 클래스의 정적 메소드입니다. 이 메소드는 Dog 객체를 생성하고, solution 메소드를 호출합니다.

이렇게 클래스와 인스턴스, 인스턴스 메소드와 정적 메소드를 이해하고 활용하면 객체 지향 프로그래밍을 효과적으로 수행할 수 있습니다.

 

 

 

 

 

 

 

[java 자바공부] 코딩테스트 공부

 


-목차의 순서 
--작동 순서

Dog 클래스

Dog 클래스의 인스턴스화한다

canSurvive 메소드는 Dog 클래스의 인스턴스 메소드

solution 메소드는 Main 클래스의 정적 메소드

 

main 메소드는 Main 클래스의 정적 메소드로서 프로그램의 시작점입니다. 

이 메소드에서 Dog 객체를 생성하고, solution 메소드를 호출하여 독들이 돌다리를 건널 수 있는지 판단하고,

 결과를 출력합니다.

객체생성과 실행을 담당

 

 

 

 

 

 

댓글