Hyogi's Notebook

Day04 JAVA Studying

by 효기’s

Q. 오버로딩 사용법 및 필요성

 

오버로딩(Overloading)은 자바에서 메서드 이름은 같지만 매개변수의 타입, 개수 또는 순서가 다른 여러 개의 메서드를 정의하는 개념입니다. 오버로딩을 사용하면 동일한 이름을 가진 여러 메서드를 사용하여 다양한 매개변수 조합에 대해 동작하도록 할 수 있습니다.

오버로딩을 사용하는 이유는 다음과 같습니다:

가독성 및 편의성: 메서드 이름을 일관되게 유지하면서도 다양한 매개변수 조합을 통해 메서드를 호출할 수 있습니다. 이는 코드의 가독성을 향상시키고 개발자가 메서드를 사용하기 쉽게 만듭니다.

코드 중복 제거: 비슷한 기능을 수행하는 여러 메서드를 하나의 이름으로 그룹화하여 중복 코드를 피할 수 있습니다. 예를 들어, 숫자 형식을 문자열로 변환하는 메서드를 여러 개 정의할 수 있습니다. 이는 유지보수 및 코드 관리를 용이하게 합니다.

다형성 구현: 오버로딩은 다형성(polymorphism)의 한 형태입니다. 메서드를 오버로딩하면 동일한 작업을 수행하지만 다른 매개변수로 호출할 수 있는 여러 메서드를 만들 수 있습니다. 이는 상속과 인터페이스를 활용한 다형성의 특징을 지원합니다.


오버로딩을 사용할 때 주의할 점은 매개변수의 타입, 개수 또는 순서가 달라야 한다는 것입니다. 메서드의 반환 타입은 오버로딩과는 관련이 없습니다.

 

 

- 오버로딩 (강사님 정의)
 동일한 함수명으로 여러개의 함수를 제공해서 사용하게 해주는 기술.
 매개변수의 타입, 또는 매개변수의 갯수로 구별이 가능함.
 목적이 다른 함수끼리는 암묵적으로 오버로딩 금지.
 리턴타입이 다른경우 -> 오버로딩이 아님.

 


Q. this의 사용법과 필요성을 말해줘

 

this는 자바에서 현재 객체를 가리키는 키워드입니다. this를 사용하여 현재 객체의 인스턴스 변수, 메서드 및 생성자에 접근할 수 있습니다. 이는 객체 내부에서 현재 객체에 대한 참조를 명시적으로 사용할 때 유용합니다.

this의 사용법과 필요성을 설명해드리겠습니다:

인스턴스 변수 접근: 클래스 내에서 인스턴스 변수와 메서드의 매개변수 이름이 동일한 경우, this 키워드를 사용하여 현재 객체의 인스턴스 변수에 접근할 수 있습니다. 예를 들어:

public class Person {
    private String name;

    public void setName(String name) {
        this.name = name; // this를 사용하여 현재 객체의 name 인스턴스 변수에 접근
    }
}



메서드 호출: 현재 객체의 다른 메서드를 호출할 때 this를 사용할 수 있습니다. 이는 같은 객체 내의 다른 메서드 간의 상호작용을 용이하게 만듭니다. 예를 들어:

public class Calculator {
    private int result;

    public void add(int number) {
        result += number;
    }

    public void calculateSum(int a, int b) {
        add(a);
        add(b);
    }
}


위의 예제에서 calculateSum 메서드는 add 메서드를 호출하여 두 개의 숫자를 더합니다. add 메서드 내에서 this를 사용하지 않아도 되지만, this를 사용하면 현재 객체의 다른 메서드를 호출한다는 것을 명시적으로 나타낼 수 있습니다.

생성자 호출: this 키워드는 생성자 내에서 다른 생성자를 호출할 때 사용됩니다. 이를 생성자 체인닝(constructor chaining)이라고도 합니다. 생성자 체인닝을 사용하면 생성자 코드의 중복을 피하고 초기화 작업을 효율적으로 처리할 수 있습니다. 예를 들어:

public class Rectangle {
    private int width;
    private int height;

    public Rectangle() {
        this(0, 0); // 매개변수를 가진 다른 생성자 호출
    }

    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }
}



위의 예제에서 기본 생성자인 Rectangle()은 this(0, 0)을 사용하여 매개변수를 가진 다른 생성자를 호출합니다. 이렇게 함으로써 초기값을 설정하는 로직을 중복으로 작성하지 않아도 되며, 코드를 재사용할 수 있습니다.

this를 사용함으로써 현재 객체의 인스턴스 변수, 메서드 또는 생성자를 명확하게 참조할 수 있습니다. 이는 코드의 가독성을 향상시키고 현재 객체와 관련된 작업을 명시적으로 나타내는 데 도움을 줍입니다.

 

 

 - this, this() (강사님 정의)
this 

내 자신의 객체를 접근하는 레퍼런스 변수
= 항상 인스턴스 메소드의 첫번재 매개변수로 항상 존재하고 있음.
= 명시적으로 선언할 수 없다. 사용만 가능하다.

1. 지역변수와 필드명이 동일할경우 this를 사용하여 필드를 구별해야한다.

우선순위가 지역변수가 빠르기 때문에.
2. 메소드에서 자기 자신의 객체를 리턴해야할경우 

 

this()
현재 클래스 내에 있는 생성자에서 오버로딩된 또 다른 생성자를 호출하는 방법.

 

 

- this와 this()의 차이

 

this: this는 현재 객체를 가리키는 키워드입니다. 주요 사용 사례는 다음과 같습니다:

현재 객체의 인스턴스 변수에 접근하기 위해 사용됩니다. 동일한 이름을 가진 인스턴스 변수와 매개변수가 있을 때, this를 사용하여 현재 객체의 인스턴스 변수를 구별할 수 있습니다.
현재 객체의 메서드를 호출하기 위해 사용됩니다. 같은 객체 내의 다른 메서드를 호출할 때, this를 사용하여 현재 객체의 다른 메서드를 명시적으로 호출할 수 있습니다.
this(): this()는 현재 클래스의 다른 생성자를 호출하는 특별한 형태의 this입니다. 주요 사용 사례는 다음과 같습니다:

생성자 체인닝을 구현하기 위해 사용됩니다. 생성자 체인닝은 한 생성자가 다른 생성자를 호출하는 것을 의미합니다. this()를 사용하여 동일한 클래스의 다른 생성자를 호출하여 초기화 작업을 중복으로 작성하지 않고도 초기화를 처리할 수 있습니다.
this()는 생성자 내의 첫 줄에서만 호출될 수 있으며, 같은 클래스의 다른 생성자를 호출하는 데 사용됩니다. 이때, 반드시 첫 줄에 위치해야 하며, 다른 코드 이전에 호출되어야 합니다.


-  추상 클래스
 * 객체를 생성할 수 없다.
 * 추상 메소드 : 구체화가 안된 메소드. abstract 키워드를 꼭 사용해서 만들어야함.
 * 추상메소드를 하나 이상 가지고 있는 클래스.
 * 주로 상속을 목적으로 사용.
 * 상속받은 자식클래스는 추상메소드를 오버라이딩을 해야한다.
 * 하지 않을 경우 자식클래스도 추상클래스화 되서 객체를 생성할 수 없다.
 * 
 * 이벤트 처리할때 가장 많이 사용.
 * 
-  인터페이스
 * 추상화, 상수 + 추상메소드
 * 

 

Q. HasA의 사용법과 의미

"HasA"는 객체 지향 프로그래밍에서 클래스 간의 관계를 나타내는 개념입니다. "HasA"는 '가지고 있다'라는 의미로 해석될 수 있습니다. "HasA" 관계는 한 클래스가 다른 클래스를 포함하고 있는 관계를 의미합니다. 이 관계는 클래스 간의 구성(composition) 또는 집합(aggregation) 관계로 표현될 수 있습니다.

 

<Has A관계 코드>

class Car {
    private Engine engine;

    public Car() {
        engine = new Engine();
    }

    public void startCar() {
        engine.start();
        System.out.println("Car started.");
    }
}

 

성적처리 class 3개를 만들어서 구현하는 실습 코드

// 성적처리를 class 3개를 만들어서 구현해봐라

package test;

import java.util.Scanner;

// 이름 클래스
class Name {
	
	// 필드
	private String[] name = new String[1]; // 하나의 이름 받음
	
	// getter setter
	public String[] getName() {
        return name; // 이름을 반환
    }

    public void setName(String[] name) {
        this.name = name; // 이름을 받아옴
    }
}

// 과목이름
class subject {
	
	private String[] scoName = { "국어", "영어", "수학" };
	
	// getter setter
	public String[] getScoName() {
		return scoName;
	}

	public void setScoName(String[] scoName) {
		this.scoName = scoName;
	}
	
}

// 과목 관리
class studyManage {
	
	private int[][] score = new int[1][4]; // 국,영,수,총
	private float[] avg = new float[1];
	
	// getter setter
	public int[][] getScore() {
        return score; // 점수를 반환
    }

    public void setScore(int[][] score) {
        this.score = score; // 점수를 받아옴
    }
	
    public float[] getAvg() {
        return avg; // 평균값을 반환
    }

    public void setAvg(float[] avg) {
        this.avg = avg; // 평균값을 받아옴
    }
    
    // 성적처리 메소드 (HasA 관계 성립)
    public void calculateScore() {
        
    	Scanner sc = new Scanner(System.in);
    	
    	Name nameObj = new Name(); // 이름 객체를 만듬.
    	
    	// 입력
        for (int i = 0; i < nameObj.getName().length; i++) {
            System.out.println("이름, 국어, 영어, 수학점수를 입력하세요:");

            nameObj.getName()[i] = sc.next(); // 이름 입력

            for (int j = 0; j < score[i].length - 1; j++) {
            	
                score[i][j] = sc.nextInt();

                score[i][3] += score[i][j];
            }

            avg[i] = score[i][3] / 3; // 평균값계산

            System.out.println(
                    "이름:" + nameObj.getName()[i] + " 국어:" + score[i][0] + " 영어:" + score[i][1] +
                    " 수학:" + score[i][2] + " 총:" + score[i][3] + " 평:" + avg[i]);
        }
    }
}


public class study30 {
	
	public static void main(String[] args) {
		studyManage studyManage = new studyManage(); // 객체생성
        studyManage.calculateScore();

	}

}

'Studying > JAVA' 카테고리의 다른 글

Day06 JAVA Studying  (1) 2023.07.10
Day05 JAVA Studying  (0) 2023.07.07
Day03 JAVA Studying  (0) 2023.07.05
Day02 JAVA Studying  (0) 2023.07.04
Day02 [예제] 문자열 동등성 비교의 결과차이  (0) 2023.07.04

블로그의 정보

감성 개발자 효기

효기’s

활동하기