[한화시스템 BEYOND SW캠프 7기] #23. 클래스와 객체 | 생성자, 오버로딩, 재귀함수

아로롱·2024년 6월 15일

BEYOND SW CAMP 7

목록 보기
24/30

🔖 메서드 (Method)

어떠한 특정 작업을 수행하기 위한 명령문의 집합으로,
중복을 피하여 프로그램을 모듈화하기 위해 사용함.

구성 요소

  • 매개변수(parameters) : 메소드 실행을 위해 필요한 변수.
  • 반환타입(return type) : 메서드가 모든 작업을 마치고 반환하는 데이터의 타입.
  • 접근제어자 : 해당 메소드에 접근할 수 있는 범위를 명시.

종류

  • 클래스 메서드 : static 이 붙어있는 클래스 내의 메서드.
  • 객체 메서드 : static 이 붙어있지 않은 클래스 내의 메서드.
    ※ 메서드에 static이 지정되어 있으면 이 메서드는 인스턴스를 생성하지 않아도 실행할 수 있다는 것을 의미한다.

함수와 다른 점이 무엇일까 ?!
둘 다 특정한 무언가를 수행하기 위해 존재하며
둘의 차이점은 독립적이냐 종속적이냐의 차이다.
함수는 독립적으로 존재하고, 메소드는 class 및 객체에 종속적이다.
1) 함수는 객체가 필요하지 않아 독립적이나, 메서드는 개체 이름으로 호출할 수 있다.
2) 함수는 데이터를 전달하거나 반환하는데 사용되며, 메소드는 클래스에서 데이터를 작동한다.

예시

// 1부터 10까지의 합인 total 값을 구한다면 ?
// for 문 -> total += i 활용할 수 있다.
// 거기에 또 20까지 더해준다면 ?! 또 for 문을 작성해서 돌리게 된다.

// 이와 같은 번거로움을 해결하기 위해 메서드를 만들어 호출한다.

package practice;

public class JavaPractice {
    public static int sumAcc(int start, int end){
        int total = 0;
        for(int i = 1; i <= end; i++){
            total += i;
        }
        return total;
    }

    public static void main(String[] args) {
        System.out.println(sumAcc(1, 10));
    }
}
 

🏫 클래스 (Class)

메소드와 변수가 확장된 좀 더 큰 프로그램으로서,
여러 변수와 메서드의 집합.

구성 요소

  • 필드 field : 상태를 나타내는 필드.
  • 클래스에 포함된 변수를 지칭.
  • static 변수 : main 밖. static이 붙어있는 클래스 내의 변수.
  • instance 변수 : static이 붙어있지 않은 클래스 내의 변수.
  • local 변수 : main 안. 메소드 내의 변수.
class myCalculator{
    static int total = 0;
    static int sum(int a, int b){
        return a+b;
    }
    static int sumAcc(int a){
        total += a;
        return total;
    }
}

class myCalculatorInstance{
    // static 이 붙어있는 변수는 클래스 변수, static 이 붙어있지 않으면 객체 변수
    int total = 0;
    int sum(int a, int b){
        return a+b;
    }
    // static -> 객체 변수에 접근이 안됨. (total 에 접근 불가)
    void sumAcc(int a){
        // this 는 객체 그 자신을 의미.
        // 만약 a 대신 total 이 들어가더라도 this 를 활용하면 명확하게 인식함.
        this.total += a;
    }
}

🍪 객체

클래스를 통해 만들어진 복사본과 같은 개념.

클래스명 객체의변수명 = new 클래스명();


객체가 과자라면, 클래스는 객체를 찍어낸 틀과 같다 !

클래스는 기능의 집합으로, 객체를 정의하기 위해서 쓰인다.

  • 클래스는 다수의 변수와 메서드로 구성.
  • 메서드란 어떤 특정 작업을 수행하기 위한 명령문의 집합.
  • 클래스는 객체의 상태를 나타내는 변수행동을 나타내는 메서드로 구성.

인스턴스(객체)

나 곰돌이 과자틀로 과자 만들거야 !
과자를 밀가루랑, 설탕이랑, 계란으로 만들거야 !
피크닉 가서 맛있는 과자를 먹어야지 ~
짠 과자 완성 ~

과자 틀 > 클래스 | @@로 과자를 만들어야지 ~ > 객체 | 과자 > 인스턴스

인스턴스는 클래스로부터 만들어진 구체화된 형태의 자료형이다.
하나의 클래스로 여러 개의 인스턴스를 만들 수 있으며,
인스턴스는 독립된 자신만의 메모리 공간을 소유한다.


✏️ 메서드 심화

메서드 호출 방식

  • static 메서드 : 메서드 이름();
  • 객체 메서드 : 객체참조변수이름.메서드이름();
    • Car myCar = new Car(); > 객체를 생성함.
    • myCar.accelerate(); > myCar 인스턴스의 accelerate 메서드를 호출함.

객체를 위한 클래스의 전형적인 구조

  • 객체변수는 private로 설정하고, 변수의 값을 변경할 수 있는 메서드는 public으로 정의.
    • 다른 클래스에서는 해당 클래스의 변수 값을 직접 수정할 수 없다. (private 이니까!)
    • 메서드를 통해서만 변수 값에 접근하고 수정할 수 있다.
    • 변수 값의 무분별한 수정을 방지함으로서 안정성 향상.
  • getter / setter 패턴
    • 변수값을 얻는(get) 용도의 public한 getter 메서드 생성.
    • 변수값을 변경하고 초기화하는 set 용도의 public한 setter 메서드 생성.

👥 생성자

자바에서는 객체가 생성될 때 호출하는 메서드.

  • new 키워드를 사용해 객체를 생성할 때, 자동으로 생성자 메서드가 호출됨.
    생성자 사용의 주 목적은 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화하기 위함.
public class Car{
	private String modelName;
    Car(String modelName){
    	this.modleName = modelName;
    }
}

➿ 오버로딩(OverLoading)

메서드 오버로딩 : 하나의 클래스 내에서 같은 이름의 메서드를 여러 번 정의하는 것을 의미.
매개변수를 다르게 설정하여 같은 이름의 메서드를 여러개 생설할 수 있다.
→ 매개변수의 개수 또는 타입이 다르다면, 메서드 오버로딩이 가능 !

    //public 이나 private 같은 접근제어자를 안 붙이면 기본적으로 default 접근 제어자 : 같은 패키지 내에서만 유효
    static int sum(int a, int b){ //static -> sum(a,b) 호출 , static 아니면 클래스명.메서드();-> C0204~~.sum(a,b)
        return a+b;
    }

    // 매개변수의 타입 또는 개수가 다르면 같은 이름의 메소드 정의 가능.
    // 즉, 메소드 오버로딩.
    double sum(double a, double b){
        return a+b;
    }

    int sum(int a, int b, int c){
        return a+b+c;
    }

♾️ 재귀함수(Recursive Call)

메서드 내부에서 해당 메서드가 또 다시 호출되는 것을 의미.
재귀 호출은 자기가 자신을 계속해서 호출하므로, 끝없이 반복.
→ while 문처럼 재귀 호출을 중단하도록 조건이 변경될 명령문을 반드시 포함해야 함.

public class C0206RecursiveBasic {
    public static void main(String[] args) {
        int sum = 0;
        for(int i = 1; i <= 10; i ++){
            sum += i;
        }
        System.out.println(sum);
        System.out.println(addAcc(10));
        // for 문으로 구할 수 있는 누적 합계를 재귀함수로 표현.

        // 피보나치 수열 구현 => 100번째
        // 1 1 2 3 5
        int a = 1;
        int b = 1;
        for(int i = 2; i < 5; i++){
            int temp = a;
            a = b;
            b = temp + a;
        }
        System.out.println(b);

        System.out.println(fibonacci(15));
    }
    static int fibonacci(int n){
        if(n <= 2){
            return 1;
        }
        return fibonacci(n-1) + fibonacci(n-2);
    }

    static int addAcc (int n){
        if(n == 1){
            return 1; // 재귀함수를 멈추게 함 !
        }
        return n + addAcc(n-1);
    }
}

📌 today

메서드와 함수의 차이에 대해 추가적으로 공부가 필요한 부분인 것 같다🥲
메서드를 좀 더 확실히 이해해보고,
강사님께 함수와 메서드의 차이에 대해 질문하고 차이를 정확하게 파악하는 것이 다음주 목표 !

profile
Dilige, et fac quod vis

0개의 댓글