2023.07.27 - java 문법 종합반(3주차) + 알고리즘 (2)

mjjin·2023년 7월 26일
0

Java 문법 종합반

목록 보기
4/8

클래스(calss)

<필드의 사용 방법>

'필드를 사용한다' 라는 의미는 필드의 값을 변경하거나 읽는 것을 의미하며
필드는 객체를 생성한 후에 사용 할 수 있다.

- 외부 접근 방법

 Car car = new Car(); 로 객체를 생성 했다면, 참조변수 car를 이용하여
  외부에서 객체 내부의 필드에 접근하여 사용할 수 있다.
  
 객체 내부의 필드에 접근하는 방법은 도트(.) 연산자를 사용한다.
  ex) car.color = "blue";

- 내부 접근 방법

 객체 내부 메서드에서도 내부 필드에 접근 할 수 있다.
  
  코드 예시)
  double brakePedal() {
  	speed = 0;
    return speed;
  }
  
  이처럼 brakePedal() 메서드 내부에서 객체의 필드 speed를 바로 호출해서 사용이 가능하다.

<메서드 호출 방법>

'메서드를 호출한다' 라는 의미는 메서드의 블록 내부에 작성된 코드를 실행한다는 의미이다.

- 외부 접근 방법

 Car car = new Car();로 객체를 생성했을 때, 참조변수 car를 이용하여
  외부에서 객체 내부의 메서드에 접근하여 호출할 수 있다.
  
  이 때, 객체의 내부 메서드 접근 방법은 도트(.) 연산자를 사용한다.
  예시) car.brakepedal();
  
  또한, 메서드가 매개변수를 가지고 있다면 호출할 때 매개변수의 순서와 타입에 맞게
  매개 값을 입력해야 한다.
  예시) car.gasPedal(100, 'D');

- 내부 접근 방법

 객체 내부 메서드에서도 내부 메서드에 접근하여 호출할 수 있다.

  코드 예시)
  double gasPedal(double kmh, char type) {
    changeGear(type);
    speed = kmh;
    return speed;
  }
  
  이처럼 gasPedal(double kmh, char type) 메서드 내부에서 
  해당 객체의 changeGear(type); 메서드를 호출할 수 있다.

<메서드 오버로딩>

오버로딩은 함수가 하나의 기능만을 구현하는 것이 아니라,
하나의 메서드 이름으로 여러 기능을 구현하도록 한다.

즉, 한 클래스 내에 이름이 같은 메서드가 있더라도 매개변수의 개수/타입/순서 등이 다르면
동일한 이름을 사용해서 메서드를 정의할 수 있다.

- 오버로딩의 조건

 메서드의 이름이 같고, 매개변수의 개수/타입/순서가 달라야 한다.
 오버로딩은 매개변수의 차이로만 구현할 수 있다.

- 오버로딩의 장점

1. 메서드 이름 하나로 상황에 따른 동작을 개별로 정의할 수 있다.

   예를 들면, 메세지를 출력할때 쓰는 println()의 경우 출력의 기능은 같지만
   매개변수로 int, double, String, boolean등 다양한 타입을 입력할 수 있다.

2. 메서드의 이름을 절약할 수 있다.
   
   위에서 예시로 쓰였던 println()가 오버로딩이 되지 않았다면
   타입이 다른 매개변수를 사용하고자 할 경우 printlnInt(), printlnDouble() 처럼
   메서드명이 길어지고 낭비 되었을 것이다.

<기본형과 참조형 매개변수>

Java에서는 메서드를 호출할 때,
매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다.

이 때의 매개변수로는 두 가지 타입이 있는데
값을 읽기만 할 수 있는 기본형 매개변수와 값을 읽고, 변경할 수 있는 참조형 매개변수가 있다.

- 기본형 매개변수

* 변수가 가지고 있는 값 자체를 매개변수로 전달한다.
  
  - 기본적으로 정수, 실수, 불리언, 문자 등의 기본 데이터 타입들이 기본형 매개변수로 전달된다.
  - 매개변수를 변경하더라도 원본 변수의 값은 변경되지 않는다.

- 참조형 매개변수

* 매개변수로 변수의 참조(메모리 주소)를 전달한다.
  
  - 주로 배열, 객체, 포인터 등의 데이터 타입들이 참조형 매개변수로 전달된다.
  - 함수 내부에서 매개변수를 변경하면 원본 변수도 함께 변경된다.

알고리즘 문제풀이

<오늘의 문제>

알고리즘 문제 출처 : 프로그래머스 스쿨
1. 양꼬치
2. 피자-나눠먹기(1)
3. 피자-나눠먹기(3)
4. 점의-위치-구하기
5. 아이스-아메리카노
6. 옷가게-할인-받기
7. 제곱수-판별하기


1. 양꼬치

class Solution {
    public int solution(int n, int k) {
        int answer = 0;
        int drinkService = 0;
        if ( (n > 0 && n < 10000 ) && (k >= n/10 && k < 10000) ) {
            k -= n/10;
            answer = (n * 12000) + (k * 2000);
            return answer;
        }
        return answer;
    }
}

2. 피자 나눠먹기(1)

class Solution {
    public int solution(int n) {
        int answer = 0;
        if (n >= 1 && n <= 100 ) {
            if (n % 7 == 0) {
                answer = n/7;
                return answer;
            }
            answer = (n/7) + 1;
            return answer;
        }
        return answer;
    }
}

3. 피자 나눠먹기(3)

class Solution {
    public int solution(int slice, int n) {
        int answer = 0;
        if (n >= 1 && n <= 100 ) {
            if (n % slice == 0) {
                answer = n/slice;
                return answer;
            }
            answer = (n/slice) + 1;
            return answer;
        }
        return answer;
    }
}

4. 점의 위치 구하기

class Solution {
    public int solution(int[] dot) {
        int answer = 0;
        int x = dot[0];
        int y = dot[1];
        if (x > 0) {
            if (y > 0) {
                answer = 1;
            } else {
                answer = 4;
            }
        } else if (x < 0) {
            if (y > 0) {
                answer = 2;
            } else {
                answer = 3;
            }
        }
        return answer;
    }
}

5. 아이스 아메리카노

class Solution {
    public int[] solution(int money) {
        int[] answer = {0, 0};
        int drinkPrice = 5500;
        answer[0] = money / drinkPrice;
        answer[1] = money % drinkPrice;
        return answer;
    }
}

6. 옷가게 할인 받기

class Solution {
    public int solution(int price) {
        int answer = 0;
        if (price >= 500000) {
            return (int)(price * 0.8);
        } else if (price >= 300000) {
            return (int)(price * 0.9);
        } else if (price >= 100000) {
            return (int)(price * 0.95);
        }
        return price;
    }
}

7. 제곱수 판별하기

class Solution {
    public int solution(int n) {
        int squareRoot = (int)Math.sqrt(n);
        if (n == squareRoot * squareRoot) {
            return 1;
        }
        return 2;
    }
}

문제 풀이 후기

강의 듣는 것 보다 알고리즘에 손이 가기 시작했다.
이러면 안되는데..
문제 푸는게 너무 즐겁다.

어제보다 코드를 깔끔하게 써보려고 최대한 노력해봤는데
코드를 한 줄로 끝내버리는 삼항연산자의 달인들이나,
수학과인가 궁금한 수학으로 코드를 줄여버리는 마술사들이 있었다.

마지막 제곱수 판별하기에서 근호를 구하는 방법을 도저히 모르겠어서
제곱근 구하는 방법은 인터넷에서 검색해서 찾았다. (Math.sqrt() 사용)

오늘도 재밌었다!

0개의 댓글