본문 바로가기

WINK-(Web & App)/JAVA 스터디

[2024-2 Java 스터디] 김재승 #3주차

반응형

1. Class and Object (클래스와 객체)

클래스는 객체를 만들기 위한 청사진이자 객체는 클래스의 인스턴스이다.( 인스턴스 : 클래스에 의해 만들어진 객체)

예제를 통해 이해해보자

class Car {
    String color;
    int speed;

    Car(String color, int speed) { // 생성자
        this.color = color;
        this.speed = speed;
    }

    void displayInfo() { // 메서드
        System.out.println("Color: " + color + ", Speed: " + speed);
    }
}

public class Main {
    public static void main(String[] args) {
        Car car1 = new Car("Red", 120); // car1 객체 생성
        car1.displayInfo();
    }
}

위와 같이 멤버변수, 즉 속성으로 color와 speed를 가지고있고 이는 각 자동차 객체가 개별적으로 가질 정보를 나타낸다. 이어서 생성자가 나오는데 Car 클래스의 객체가 생성될 때 초기화 작업을 수행한다고 보면 될 것 같다.

다음은 메서드인데 자동차의 정보를 출력하는 하나의 기능을 하는 곳이라고 보면 될 것 같다. 마지막으로 메인 메서드에서 객체 car1을 생성하고 있고 displayInfo() 메서드를 통해 car1의 속성 정보가 출력된다고 생각하면 된다.

2. Parameters and Arguments (매개변수와 인수)

'매개변수' 는 메서드나 생성자에서 사용되고 메서드를 호출할 때 전달하는 실제 값을 '인수' 라고 보면 된다.

예를 들어 Car 생성자는 color와 speed라는 매개변수를 사용하며, new Car("Red", 120)에서 "Red"와 120이 각각 인수로 전달된다.

  • 매개변수: color, speed와 같이 메서드나 생성자에서 정의된 변수로 이를 통해 외부에서 전달된 데이터를 받음.
  • 인수: new Car("Red", 120)에서 "Red"와 120이 color와 speed에 인수로 전달됨.

3. Method (메서드)

메서드는 앞에서 설명했듯이 특정 클래스의 객체의 정보에 관해 어떠한 기능을 수행하는 공간이라고 보면 된다.

객체가 특정 동작을 수행할 수 있게 하며 객체의 상태를 변경해서 계산을 할 때도 사용된다.

void displayInfo() {
    System.out.println("Color: " + color + ", Speed: " + speed);
}

위 코드에서 displayInfo()는 Car 라는 클래스의 객체의 속성인 color와 speed를 출력하는 작업을 수행하는 Method이다.

 

  • 메서드 구조: void는 리턴값 처리 형태를 의미하며, 여기서 void는 리턴값이 없음을 나타냄
  • 메서드 호출: car1.displayInfo()와 같이 객체를 통해 호출되고 객체가 할 수 있는 행동을 정의하는 역할을 함.

 

4. Call by Value & Call by Reference (콜 바이 밸류 & 콜 바이 레퍼런스)

Call by Value & Call by Reference 는 값을 전달하는 방식에 관한 것인데, java에서 기본적으로 Call by Value 의 방식을 통해 값을 전달한다. 값을 복사해서 전달하는 방식을 call by value , 참조값을 전달하는 것을 call by reference라고 하며 , 참조값을 전달한다는 것은 전달한 값의 변동이 생기면 원본에도 영향을 미치는 구조라고 생각하면된다.

(call by value와의 중요한 차이점이다)

class Demo {
    int value;

    Demo(int value) {
        this.value = value;
    }

    static void modifyPrimitive(int num) {
        num += 10;  // 'num' 변수에 10을 더하지만, 호출한 곳에는 영향이 없음
    }

    static void modifyObject(Demo obj) {
        obj.value += 10;  // 'obj'의 'value' 속성 값이 10 증가
    }

    public static void main(String[] args) {
        int x = 5;
        modifyPrimitive(x);
        System.out.println("Primitive after modification: " + x); // x는 여전히 5

        Demo demo = new Demo(5);
        modifyObject(demo);
        System.out.println("Object after modification: " + demo.value); // demo.value는 15
    }
}

 

  • 기본형(Call by Value): modifyPrimitive 메서드에서 int num의 값을 변경해도 원래 변수 x에는 영향을 주지 않음.
  • 참조형(Call by Reference처럼 동작): modifyObject 메서드는 객체의 속성을 변경할 수 있음. Demo 객체의 value 속성은 실제 객체의 참조를 통해 메서드에 전달되어 변경이 가능함.

 

5. Inheritance (상속)

상속은 객체지향 프로그래밍에서 코드의 재사용성을 높이는 중요한 개념으로 하나의 클래스가 다른 클래스의 속성과 메서드를 물려받아 사용할 수 있게 하는 기능이다. 상속을 사용하면 기본 클래스(부모 클래스)에서 공통 기능을 정의하고, 파생 클래스(자식 클래스)에서는 이를 확장하여 고유한 기능을 추가할 수 있다.

// 부모 클래스
class Animal {
    String name;

    public void eat() {
        System.out.println(name + " is eating.");
    }
}

// 자식 클래스
class Dog extends Animal {
    public void bark() {
        System.out.println(name + " says Woof!");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "Buddy";
        dog.eat();     // 부모 클래스의 메서드를 호출
        dog.bark();    // 자식 클래스의 메서드를 호출
    }
}

 

Animal 클래스는 부모 클래스이며, name 속성과 eat() 메서드를 가지고 있음.

Dog 클래스는 Animal 클래스를 상속받아 새로운 메서드 bark()를 추가했고, Dog 클래스는 Animal 클래스의 eat() 메서드와 name 속성을 사용할 수 있게 됨. 메인 메서드에서 새로 생성한 객체의 속성을 정의하고 Dog 객체가 eat()과 bark() 메서드를 모두 호출하여 코드 실행 시 출력될 수 있도록 함.

 

 

6. Method Overloading (메서드 오버로딩)

메서드 오버로딩은 같은 이름을 가진 메서드를 매개변수의 종류나 개수를 다르게 해서 여러 번 정의하는 것을 의미한다. 자바에서는 메서드의 이름이 같더라도 매개변수가 다르면 서로 다른 메서드로 간주하기에 메서드 오버로딩은 편리함을 제공하여 다양한 기능을 하는 메서드를 동일한 입력으로 처리할 수 있게 한다.

class Calculator {
    // 두 정수의 합을 계산
    public int add(int a, int b) {
        return a + b;
    }

    // 세 정수의 합을 계산
    public int add(int a, int b, int c) {
        return a + b + c;
    }

    // 두 실수의 합을 계산
    public double add(double a, double b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calc = new Calculator();
        System.out.println("Sum of two integers: " + calc.add(5, 10));
        System.out.println("Sum of three integers: " + calc.add(5, 10, 15));
        System.out.println("Sum of two doubles: " + calc.add(5.5, 10.5));
    }
}

 

Calculator 클래스에서 add 메서드는 세 가지 오버로드된 형태로 정의되어 있다.

  • add(int a, int b): 두 개의 정수를 더하는 메서드
  • add(int a, int b, int c): 세 개의 정수를 더하는 메서드
  • add(double a, double b): 두 개의 실수를 더하는 메서드

 

각 메서드는 매개변수의 타입이나 개수가 다르기 때문에 서로 다른 메서드로 간주되어 오버로딩된다.

calc.add(5, 10), calc.add(5, 10, 15), calc.add(5.5, 10.5)와 같이 호출할 때 각각 다른 오버로드된 메서드가 실행됨.

 

7. Method Overridng (메서드 오버라이딩)

메서드 오버라이딩은 자식 클래스가 부모 클래스의 메서드를 재정의하는 기능이다. 부모 클래스의 메서드와 같은 이름, 같은 매개변수를 가지며, 이를 통해 자식 클래스가 부모 클래스의 기본 동작을 원하는 방식으로 변경할 수 있다.

// 부모 클래스
class Animal {
    public void sound() {
        System.out.println("Some generic animal sound");
    }
}

// 자식 클래스
class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Woof Woof");
    }
}

class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("Meow Meow");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        myAnimal.sound(); // "Some generic animal sound" 출력
        myDog.sound();    // "Woof Woof" 출력
        myCat.sound();    // "Meow Meow" 출력
    }
}

Animal 클래스는 기본적으로 sound() 메서드를 정의하고 있다.

Dog와 Cat 클래스는 Animal을 상속받아 각각의 sound() 메서드를 재정의, 즉 오버라이딩 한다.

myAnimal.sound()는 부모 클래스의 메서드를 호출하여 "Some generic animal sound"를 출력한다.

반면, myDog.sound()와 myCat.sound()는 각각 자식 클래스에서 오버라이딩된 메서드를 호출하여 "Woof Woof"와 "Meow Meow"를 출력하게 된다.

 

메서드 오버라이딩은 자식 클래스가 부모 클래스의 기본 동작을 변경할 수 있는 유연성을 제공한다.

이를 통해, 동일한 메서드 이름으로 서로 다른 동작을 수행하게 할 수 있다.

 

 

객관식 문제 ---
1번 객체지향 프로그래밍(OOP)의 4대 특징이 아닌 것은? d
2번 클래스에서 필드와 메서드의 차이점은 무엇인가? a (필드뿐만 아니라 메서드도 객체에 속할 수 있음)
3번 다음 중 this 키워드의 역할은 무엇인가? b (내부 클래스내에서 멤버변수와 매개변수의 이름이 같은 경우 구분하기 위해 사용되기도 함)
4번 클래스에서 this 키워드를 사용하는 이유는 무엇인가? a
5번 메서드의 리턴 타입이 void인 경우, 메서드가 반환하는 값은? c
6번 아래 코드에서 출력값은? b
7번 매개변수와 인자의 차이는 무엇인가? a
8번 메서드가 값을 반환하는데 사용하는 키워드는? a
9번 메서드 내에서 선언된 변수의 효력 범위는? d
10번 자바에서 call by value의 의미는? c
11번 객체를 생성할 때 사용하는 키워드는? c
12번 다음 중 클래스 멤버에 해당하지 않는 것은? d
13번 다음 중 지역변수와 필드를 구분하는 올바른 방법은? c 
14번 자바에서 기본 데이터 타입을 객체로 감싸는 클래스는? a ?? 
15번 객체의 생성자를 호출하는 역할을 하는 것은? c ?? 
16번 return 키워드는 언제 사용되는가? a ??
17번 call by reference는 무엇을 의미하는가? b

서술형문제 ---
-클래스와 객체의 차이점?
ㄴ 클래스는 하나의 틀이자 설계도라면 객체는 설계도로 구현한 모든 대상을 의미한다.


-this키워드를 사용하는 이유?
ㄴ매개변수와 멤버변수를 구분하기 위해서 사용함


-필드와 지역 변수의 차이점을 설명하고 this 키워드가 사용되는 이유를 함께 설명
ㄴ지역변수는 특정 구역에서 생성되어 그 지역에서만 사용가능한 변수이고 필드는 인스턴스 변수(객체 변수)와
클래스 변수(static 변수)가 존재하며 각각 클래스 내부에서 , 다른 클래스에서도 자유롭게 사용가능하다는 특징이
있음 this 키워드는 이런 지역변수가 메서드 내에서 특정 이름을 갖는다치면 필드와 이름이
겹칠 수도 있기에 이를 구별하는데 이용됨


-자바에서call by value와 call by reference의 차이?
ㄴ함수가 인수를 전달할 때 사용되는 방식을 나타내는 것으로 콜 바이 밸류는 값을 복사해서 전달하고
콜 바이 레퍼런스는 참조 값을 전달한다. 따라서 전달된 변수의 값을 변경하면 콜 바이 레퍼런스는 변경되고
콜 바이 밸류라면 그대로이다.


-메서드 내에서 선언된 변수의 효력 범위(scope)란?
ㄴ변수들은 선언 위치 등에 따라 사용 가능한 범위를 가지는데 메서드 내에서 선언된 변수의 경우에는
메서드 블럭 내에서만 사용 가능하다.


-자바에서 생성자의 역할?
ㄴ인스턴스 변수의 초기화 작업에 사용된다.


-클래스에서 final키워드를 사용하는 이유와 그 효과?
ㄴ원시타입에 경우 final로 선언 시 초기화 된 변수는 변경할 수 없는 상수값이 되고 객체 타입의 경우에는
다른 참조 값을 지정할 수 없는 등 초기 설정을 변경할 수 없게끔 선언하는 방식이다. 추가적으로 메서드를
final로 선언하면 상속받은 클래스에서 오버라이딩이 불가능하다.


-메서드가 return을 사용하는 이유와 반환되는 값을 처리하는 방법?
ㄴreturn은 함수가 외부로부터 호출되었을 때 그 결과를 외부에 제공하는 방법으로 쓰이며
메서드 내에서 사용한 return은 return 뒤에 따라오는 값을 메서드의 결과로 반환하며 반환값이 없다면
메서드 선언 시에 void를 적어준다. 


-객체를 생성하는 방법과 그 과정에서 new연산자의 역할?
ㄴ ' 클래스 객체변수 = new 클래스(); ' 이와 같은 순서로 써주면 객체를 생성할 수 있다.
여기서 new 연산자는 메모리 heap 영역에 데이터를 저장할 공간을 할당받고 
그 공간의 참조값을 객체에게 반환한다.


-클래스와 인터페이스의 차이점?
ㄴ클래스와 달리 인터페이스는 인스턴스를 생성할 수 없고 다중 상속이 가능하다. 주로 클래스에서
특정 메서드를 구현하도록 강제할 때 사용된다.


-다음 코드에서 this 키워드가 어떻게 동작하는지 설명하기
ㄴ필드로 선언된 value라는 멤버변수에 Test라는 메서드의 매개변수인 value가 저장된다.


-지역 변수와 전역 변수의 차이점?
ㄴ지역 변수란 특정 지역(블록) 내에서 선언된 변수이고 전역 변수란 특정 메서드나 블록 외부에서 선언된 변수로 지역변수와 달리 프로그램 전체에서 접근할 수 있다는 특징이 있음


코테 ---
1번

2번

 출력값 : [1,3,0,1]

반응형