D+29-함수.배열을매개변수로,오버로딩,setter,getter,전역함수(static),싱글톤.싱글톤,상수.final

Bku·2024년 2월 5일

학원 일기

목록 보기
26/67
post-thumbnail

함수

함수

함수는 클래스에서 기능, 동작을 나타낸다.

예를 들어 계산기에서 전원을 켜거나, 끄기, 연산등을 말한다.

사용법

   void powerOn(){
        System.out.println("전원 켜기");
    }

위와 같은 형태로 만들수 있다.

return

int plus(int x, int y){
      int result = x + y;
      return result;

함수의 속성은 함수가 끝나면 효력을 잃는다. 하지만 이것을 함수 밖으로 내보낼 수 있는 것이 return이다. 이것을 이용해 result의 값이 위 함수가 끝나도 지속된다.

함수의 타입과 return의 타입을 맞춰줘야하면, return을 사용하지 않는 함수는 void처리를 해주어야한다.

배열을 매개변수로 받는 함수

public class Computer {
//    1) 매개변수로 배열을 받아 누적합 구하는 함수
    int mySum(int[] value){
     int sum = 0;

        for (int i = 0; i < value.length; i++) {
            sum += value[i];
        }
        return sum;
    }
}

main

public class ComputerApplication {
    public static void main(String[] args) {
        Computer computer =new Computer();
        int[] value = {1,2,3,4,5,6,7,8,9,10};

        System.out.println(computer.mySum(value));
    }
}

결과

위와 같은 방법으로 사용할 수 있다.

함수의 장점

함수는 한번 만들어 놓으면 다시 코드를 짜지 않고도 사용할 수 있다. 또한 매개변수를 사용하면 값만 바꾸어 주면 똑같은 코드를 짜지 않아도 다른 값들을 만들어준다.

함수 오버로딩

매개변수나 return값을 다르게 사용하면 같은 함수명을 이용할 수 있도록 허용하는 것이다.

사용법

public class Calculator {// 정사각형 넓이
    double area(double width){
        return width * width;
    }
    
    double area(double width, double height){ // 직사각형 넓이
        return width * height;
    }
}

이름은 갖지만 매개변수와 리턴값이 다르다.

사용하는 이유

언제 사용하는지 궁금해서 chat GPT에 물어봤다.

  1. 명확한 코드: 오버로딩을 사용하면 동일한 이름의 메서드를 여러 개 정의할 수 있습니다. 이는 메서드의 기능이나 의도를 나타내는 이름을 사용하면서도 다양한 매개변수를 처리할 수 있습니다. 이는 코드를 읽고 이해하기 쉽게 만들어줍니다.

  2. 유연성과 다형성: 오버로딩은 메서드의 다형성을 촉진합니다. 같은 이름의 다른 시그니처(매개변수 유형 또는 개수)를 가진 여러 메서드를 정의함으로써 같은 작업을 수행하는 메서드의 다양한 버전을 만들 수 있습니다. 이는 코드를 더 유연하고 재사용 가능하게 만들어줍니다.

  3. 편의성: 오버로딩을 사용하면 메서드를 호출할 때 사용자가 다양한 매개변수를 제공할 수 있습니다. 이는 사용자가 메서드를 호출할 때 편의성을 높여줍니다. 사용자는 같은 이름의 메서드를 호출하고 원하는 매개변수를 전달함으로써 필요한 작업을 수행할 수 있습니다.

  4. 자연스러운 API 설계: 클래스 또는 API를 설계할 때 오버로딩을 사용하면 일관된 인터페이스를 유지하면서 다양한 동작을 지원할 수 있습니다. 이는 사용자가 클래스 또는 API를 사용할 때 직관적이고 자연스러운 경험을 제공합니다.

같은 기능을 하지만 필요한 변수의 개수나 타입이 다른 경우 오버로딩을 사용하면 좋을거 같다.

setter함수

속성에 값을 저장하거나 수정하는 함수이다. 보통 속성들은 private로 접근 제한이 걸려있어서 외부에서 값에 접근하기가 어렵다. 그래서 setter함수를 통해 개발자가 제한한 범위내에 값에 사용자가 접근을 할 수 있게 한다.

관례적으로 함수이름은 set속성명으로 짓는다.

사용범

public void setSpeed(int speed) {
        if (speed <= 0) {
            this.speed = 0;
        }else{
            this.speed = speed;
        }
    }

이렇게 스피드는 -로 가지 않으면서도 privat속성의 값을 함수를 통해 바꿀수 있게된다.

getter함수

속성에 값을 가져오거나 조회하는 함수이다. 마찬가지로 private로 제한이 되어있는 속성의 값은 사용자로서는 확인을 할 수가 없다. 그래서 이 함수를 통해 확인을 할 수 있다.

 public class Car {
    private String model;
    private int speed;

    public Car(String model) {
        this.model = model;
    }

    public void setSpeed(int speed) { //setter
        if (speed <= 0) {
            this.speed = 0;
        }else{
            this.speed = speed;
        }
    }

    public int getSpeed() {//getter
        return speed;
    }
}

이렇게 함으로써 private인 speed의 값을 확인 할 수 있다.

getter를 하지 않고 값을 확인 할 수 있는지를 보자

getter에서는 오류가 나지 않지만 속성을 바로 들고오면 다음과 같이 오류가 나는 것을 확인 할 수있다.

전역변수 전역함수

public class Calculator {
    // 전역 변수
    static double pi = 3.14;

    //전역 함수
    static int plus(int x, int y){
        return  x+y;
    }
}

이렇게 변수 앞에 static을 붙여주면 전역 변수, 함수가 된다. 전역변수와 함수는 인스턴스를 생성해주어 함수를 호출할 필요 없이 바로 클래스이름에 점을 찍고 사용이 가능하며, 함수가 종료 되어도 값이 초기화되지 않는다.

결과

인스턴스를 호출 하지 않음에도 불구하고 실행이 잘 된것을 볼 수 있다.

전역의 단점

  1. 메모리를 많이 잡아먹기 때문에 되도록이면 최소한으로 사용하는 것이 좋고
  2. 또한 결합도가 증가할 수 있으므로 주의해야한다.
  3. 인스턴스의 변수나 함수를 스태틱이 사용할 수 없다.


같은 클래스의 속성이라도 static 함수에서는 (메인함수는 static임)사용을 할 수 없다.

그림과 같이 인스턴스를 만들어서 사용해야한다.

singleton

인스턴스를 많이 만들면 메모리가 많이 사용된다. 그래서 하나의 인스턴스만 만들고 이것을 다른 클래스에서도 static으로 사용할 수 있게 하는 기능이 singleton기능이다. (정보공유도 편리하게 가능)

package chap06.sec05.exam04;

/**
 * packageName : chap06.sec05.exam04
 * fileName : Singleton
 * author : GGG
 * date : 2024-02-05
 * description : TODO: 전역 클래스(객체) : Singleton(싱글톤)
 *                 특징 : 오직 1개만 객체가 생성됨
 *                    다른 객체들은 생성된 객체를 공유함
 *                    예) 채번 : 1씩 증가값 -> 싱글톤 속성에 저장
 *                      => 다른 객체들이 현재 증가된 값을 조회하면
 *                         모두 같은 값을 조회할 수 있음
 * 요약 :
 *      TODO: 1) 자바 -> 2) 벡엔드 프레임워크 : Spring
 *       디자인 패턴 : 26가지 패턴(설계형태)
 *       => 코딩테스트 대비 : 실전연습 (브론즈 계열)
 *          -> 알고리즘(스택, 큐, 탐색(깊이, 너비) 등) : 실버계열
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2024-02-05         GGG          최초 생성
 */
public class Singleton {
//    알고리즘 : 1) 다른 객체가 생성하지 못하도록 막기
//              2) 1개만 미리 객체를 생성
//              3) 다른 객체는 만들어진 객체를 받아서 사용
//    TODO: 접근제한자 : public (공공) vs private (사적 : 나만 사용)

    //     2) 1개만 미리 객체를 생성
    private static Singleton singleton = new Singleton();

    //    1) 다른 객체가 생성하지 못하도록 막기
//      클래스 생성 : 클래스명 변수 = new 생성자함수(); // 사용못하게 함
    private Singleton(){}

    //    3) 다른 객체는 만들어진 객체를 받아서 사용 : 전역함수로 정의
    static Singleton getInstance() {
        return singleton;
    }
}

방법


방법은 다음과 같다.

getInstance를 이용하여 같은 인스턴스인지 확인

public class SingletonApplication {
    public static void main(String[] args) {
//        1) 싱글톤 객체 2개 확인 : 같은지? (스택방주소) ==
        Singleton singleton = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();

        if(singleton == singleton2) {
            System.out.println("같은 객체임");
        } else {
            System.out.println("다른 객체임");
        }
    }
}

출력

참조값이 같은 것을 확인할 수 있다.

자세한 내용은 따로 자바 독학 시리즈에 정리했음

상수

상수

자바에서 상수는 final이다. 상수의 값을 한번 지정하면 변경할 수 없다.

상수의 제한

또한 정의 즉시 값을 넣어주어야하고 넣어주지 않으면 컴파일에러 발생. 즉시 넣지 않을경우 생성자를 이용해서 값을 넣어야한다.
생성자를 넣지 않고 값도 넣지 않아 에러가 뜬다.


생성자를 만들어주어서 에러가 사라졌다.

생성자로 값정의와 필드에서 값 정의

둘의 차이는, 다른 클래스, 즉 클라이언트 클래스에서 값을 지정할 수 있게 해주고 싶은경우 생성자를 이용하면된다.

그러나 클라이언트가 값을 바꾸지 못하게 하기 위해서는 필드에서 값을 미리 지정해놓으면 된다.

전역상수

상수 앞에 static이 붙으면 상수의 이름을 대문자로 지어주는게 관례이다.

public class Earth {
    // EARTH_RADIUS : 지구 반지름
    static final double EARTH_RADIUS = 6400;
    // 지구의 표면적 : 4 * 3.14 * 지구 반지름 * 지구 반지름
    static final double EARTH_AREA = 4 * 3.14 * EARTH_RADIUS * EARTH_RADIUS;

}
profile
기억보단 기록

0개의 댓글