함수

ChoRong0824·2023년 5월 4일
0

Java

목록 보기
13/31
post-thumbnail

필자가 지속적으로 자바를 복습하는 이유는,
한 가지 언어를 완벽하게 구사하기 위해서입니다.
여러 언어를 익히는 것도 좋지만, 저는 Java를 완벽하게 정복하고 싶습니다.
따라서, 이전에 공부했던 내용이지만, 다른 교재 및 강의를 지속적으로 시청하고 있으며, 이에 따라 지속적으로 Java에 대해 포스팅하게 되었습니다.
또한, 코딩테스트 및 알고리즘을 게을리 하지 않고, 매일 공부하고 있습니다 ! 🏃‍♂️
(먼 미래엔 제가 자바를 강의할 정도의 실력이 되어 있길🙏)
강의 출처 : 인프런 자바 입문, 인프런 자바 100제 , 자바 TPC
교재 출처 : 명품자바 프로그래밍, 두잇 자바, 자바의정석
개발 환경 : IntelliJ IDEA


문제1, 메서드, 정의, 메서드 구현

  • 아래의 메서드 구현 코드에서 틀린 곳을 찾아 올바르게 수정하시오.
public class JavaExam{
	public void helloWorld(){
    	System.out.println("Hello,World);
    }
	public static void main(String p[args){
    	// 메서드 호출
        helloWorld();
    }
}

메인메서드가 static 메서드로 되어있기 때문에, 메서드 호출에도 static을 해줘야 호출할 수 있습니다. (스태틱은 스태틱끼리 호출할 수 있음)


문제 2,     메서드

  • 메서드의 정의와 기본적인 자바의 메서드를 작성해보시오.

메서드란 무엇인가 ?

  1. 메서드는 다른 언어에서의 함수와 마찬가지로 어떤 특정한 동작이나 처리를 하도록 만들어진 코드 단위
  2. 반복적인 작업을 처리해야 하는 경우, 메서드로 만들어 놓으면,
    이후에 필요할 때, 다시 재사용 할 수 있어서 아주 유용
  3. 메서드는 호출 시, 어떤 결과를 반환하기도 하지만, 결과를 반환하지 않는 메서드도 존재
  4. 메서드는 호출 시, 어떤 인자 값들을 넘겨서 호출하는 경우도 있지만, 인자 값 없이 호출하는 경우도 존재

메서드 종류 (크게 4)

  1. 반환값 x, 받는 인자값 x
  2. 반환값 x, 받는 인자값 O
  3. 반환값 O, 받는 인자값 x
  4. 반환값 O, 받는 인자값 O

유형 1, 반환값 x, 받는 인자값 x

(반환 값이 없다는 것은 void를 써주면 된다는 것)
-> void는 return을 안하니까.
즉, return 쓰려면 자료형 타입으로 와야해서 (필자생각)

public class Main {
	// <span><!>반환 값이 없다는 것은 void를 써주면 된다는 것.<!></span>
    public static void  showMenu(){
        System.out.println("showMenu 호출 ");
    }

    public static void main(String[] args) {
        showMenu();
    }
}

유형 2, 반환값 x, 받는 인자값 O

// 반환값이 없고 받는 인자값이 2개 있는 덧셈 메서드를 구현
-> 받는 인자 값이 있다는 뜻은,
내가 함수를 호출하는 순간, 리턴값은 없지만, 이 함수(메서드)가 호출부에서 파라미터 값을 넘긴다는 뜻

public class Main {
    private  static void sum(int x, int y){
        System.out.printf("인자로 넘겨받은 2개 값 %d,%d \n",x,y);
        System.out.print("합은"+(x+y));
    }

    public static void main(String[] args) {

        int a = 10, b= 20;
        sum(a,b);
    }
}

유형 3, 반환값 o, 인자값 x

-> 메서드(함수) 호출에 따른 리턴값이 있는 것임, 호출 시 리턴 값을 받는 변수를 정의

public class Main {
    private  static int returnMethod(){
        int result = 100;
        result*=200;
        return result;
    }

    public static void main(String[] args) {
        int result;

        result = returnMethod(); // 호출해서 그것을 변수에 저장
        // Output
        System.out.println(result);
    }
}

유형 4 반환값 o, 인자값 o

// 메서드 ("java") 입력 시, 대문자로 출력되게
-> 호출 시 리턴값을 받는 변수를 정의한다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    private  static String returnMethod(String str){

        String changeStr = str.toUpperCase();
        return changeStr;
    }

    public static void main(String[] args)throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        System.out.print(returnMethod(str));
    }
}

틀린 부분 찾기

public class java {
	
	public static String capitalMethod( String str ) {
		String ret = str.toUpperCase();
		return ret;
	}
    
	public static void main(String[] args) {
		String rst;
		rst = capitalMethod( 'java' );
		
		System.out.println( "입력한 소문자의 대문자는 = "+ rst );
	}
}

정답이 궁금하시면 댓글 남겨주시면 감사하겠습니다.


문제 3 ,    static

// static 선언이 안되어있는 메서드를 사용하는 방법에 대해서 코드로 구현해보시오.

public class java {
    public void helloWorld() {
        System.out.println("Hello,");
    }

    public static void main(String[] args) {
    	helloWorld();
    }
}

스태틱이 선언되어 있으면, 클래스명.메서드명();으로 원래 접근하면 되지만,
스태틱이 없다면 객체를 생성해서 사용하면 되는거임.

  • 객체 생성 후 메서드 호출
public class java {
    public void helloWorld() {
        System.out.println("Hello,");
    }

    public static void main(String[] args) {
        // 객체 생성 후 메서드 호출
        java jes = new java(); // 객체 생성
        jes.helloWorld();
    }
}

문제4,    Call by Value, 메서드로 인자 전달시 정수 100을 보냈을 때의 아래 코드의 결과를 말해보시오

// Call by Value

  • 메서드 호출 방식 (문제 1번)
public static void sum( int a ){ 
	a += 400;
	System.out.println( a );
}
public static void main(String[] args) {
	int a = 100;
	sum( a ); // Call by Value 방식
    System.out.println( a );
}

Call by value --> 값에 의한 호출 (값 자체를 보낸다는 것임)
메서드로 인자값을 넘길 때, 해당 값을 복사하여 넘기는 방식 --> 따라서, sum()메서드 내부에서는 복사된 값으로 처리를 한다.

정리

참조형 타입은 너무 무거워서 고래(값)가 죽은 위치만 사람 핸드폰에 위치만 적어서 가지고 다니는 것.
언제든지 위치를 확인하면 갈 수 있으니까.
참조형 타입은 객체나 배열 같은 것들은 주소 값만 전달됨.
참조형 타입은 주소값을 공유하기 때문에, 값이 공유됨.
즉, 주소 값은 값 자체가 공유됨.
그런데, 값 전달은 서로 관여 x -> 값 자체를 보내버렸기 때문에
즉, 값에 의한 호출 -> 값에 의해서 (메서드를) 호출


다시말해

참조형 타입은

크기가 큰 객체나 배열 등의 데이터를 효율적으로 처리하기 위해 사용됩니다.
이 경우 값이 아닌 주소 값만 전달되어 데이터의 무게를 줄입니다.

참조형 타입은

주소값을 공유하므로, 실제 데이터도 공유됩니다.

BUT,

값 전달 방식은 데이터 자체를 전송하기 때문에, 서로 영향을 주지 않습니다. 이 방식은 값을 이용해 메서드를 호출하는 것으로 이해됩니다.

요약하자면,

참조형 타입은 주소값을 공유하여 데이터를 처리하고, 값 전달 방식은 값을 직접 전송하여 메서드를 호출합니다.


문제5,    메인 메서드에서 100을 보냈을 때, 값이 수정되게끔 Call by reference 방식으로 코드를 수정하시오.

// Call by reference
// a 값이 같은 결과가 나오도록 코드 수정

  • 메서드 호출 방식 (문제 2번)
  • 문제 4번 코드를 Call by reference 방식으로 수정

9할정도 정답에 근접한 방법

Wrapper 클래스의 Integer 클래스 타입으로 변수 a를 선언하고, new로 객체를 생성하여, 해당 주소 값을 메서드로 보내는 것입니다.

해당 코드는 맞는 코드일까요 ?
public class Main {
    public static void sum(int[] a){

        System.out.println(a); // 주소 값이 찍히는게 아니라 100이라는 값이 찍힘.
    }
    public static void main(String[] args) {
        Integer a = new Integer(100);
        sum(a);
        System.out.println(a);
    }
}

즉, call by value방식으로 사용됨.

5번 추가 Study

배열 코드

public class Main {
    public static void sum(int[] a){

        System.out.println("sum()메서드 안 a값"+a);
    }
    public static void main(String[] args) {
        int[] a = new int[5];
        sum(a);
        System.out.println("main()메서드 안 a값"+a);
    }
}

new 키워드

  1. 객체 생성
  2. 메모리 상의 공간을 만들어 두고, 주소 값을 return
  • 객체생성 코드
public class Main_java_Method {
    public static void sum(Main_java_Method a){
        System.out.println(a);
    }
    public static void main(String[] args) {
        Main_java_Methodain a = new Main_java_Method(); // 객체 생성
        sum(a);
        System.out.println(a);
    }
}
위 코드의 결과 값은 ?

문제6,   메인 메서드에서 정수를 Call by reference 방식으로 메서드 호출하는 코드를 구현

  • 메서드 호출 방식 (문제 3번) -> 여기서 2번을 해결할 예정.
    // 이 문제는 앞서 다뤘던 문제의 Call by value 방식을 Call by reference 방식으로 수정해서 보내라는 의미이며, a 값이 같은 결과가 나오도록 코드를 수정했다.
class TestNumber{
	int num;
    TestNumber(int num){this.num = num;}
}

this

이 클래스에서 어떤 객체가 생성될 때, 생성자가 제일 먼저 호출이 되어지는,
생성자는 이 클래스의 객체가 만들어질 때, 제일 먼저 실행되는 메서드가 되는 것.
이때 this 는 그 객체를 의미함.

정답

class TestNumber{
    int num;
    TestNumber(int num){this.num = num;}
}
public class Main {

    public static void sum(TestNumber a){ // 파라미터를 int 에서 TestNumber 로 바꿔줌.
        System.out.println(a); // a값을 출력해보면 주소가 들어있음
        System.out.println(a.num); // 100 출력, a라는 객체의 num
        a.num += 400; // 이렇게 더하면 주소값 더하기임. 공유된 주소를 더함
        System.out.println(a.num); // 100 출력, a라는 객체의 num
    }
    
    public static void main(String[] args) {
        TestNumber a = new TestNumber(100); // a는 주소값을 가지고 있음.
        sum(a); // 주소 값을 전달함
        System.out.println("==============");
        System.out.println(a.num); // 100 -> 같은 곳을 가리킴, 만약 같은 주소값 참고한 곳을 수정하면 해당 값도 변경됨.
    }
}

문제 7,   2개의 정수형 값을 리턴하는 메서드를 구현

// 아래의 코드에서 2개의 리턴 값을 받는 코드는 (1)과 (2)중 어느 것인가?

// (1)
public static int[] testMethod() { 
	int num1 = 100; 
    int num2 = 200;
	return num1, num2;
}
// (2)
public static int[] testMethod() { 
	int num1 = 100; 
    int num2 = 200;
	return num1; 
	return num2;
}
  • 정답 : 둘다 틀린 것입니다 ㅋㅋㅋㅋ
    (참고로 파이썬은 가능합니다...)

배열로 해결

  • 자바는 배열 자체를 리턴해주면 됩니다.
    여기서, 문제속에 문제
public class Main{
    private static int testMethod(){
        int num1 = 100;
        int num2 = 200;
        return new int[]{num1, num2};
    }

    public static void main(String[] args) {
        int result = testMethod();
        System.out.println(result);
    }
}

위 코드를 보고, 틀린 부분들을 수정해주세요.

public class Main{
    private static int[] testMethod(){ // 배열로 반환시 타입이 int 면 에러뜸. 반환하는 타입을 int[]로 수정해줘야함
        int num1 = 100;
        int num2 = 200;
        int num3 = 300;
        return new int[]{num1, num2, num3};
    }

    public static void main(String[] args) {
        int [] result = testMethod(); // 배열 변수를 선언 --> 메서드로 부터 반환 받을 값이 배열이기 때문에

        // 배열은 참조형 타입.
        System.out.println(result); // 배열명을 그냥 찍으면, 주소 값이 출력됨. (참조형 타입이라서)
        // 배열이 생성된 공간의 주소를 result 가 알고있음.
        
        // 아래처럼 각각 출력해야함.
        System.out.println(result[0]+"-"+result[1]);
        // 연산
        System.out.println(result[0]+ result[1]);
        // 배열 안에 있는 모든 요소를 출력하고 싶을 때,
        System.out.print(Arrays.toString(result)); // 모든 요소 출력 --> 반복문 사용 없이
    }
}
  • 배열 안에 있는 모든 요소를 출력하고 싶을 때, Arrays.toString 사용

참고,

주소값을 찍었을때,
[ 은 배열을 의미
[이후에I || D 가 오는데, 정수인지 실수인지를 알려주는 것입니다.


문제8, 반환값이 2개 있는 메서드를 구현

// 메서드는 ( "korea", "USA" ) 입력시 소문자는 대문자로 대문자는 소문자로 출력되도록 구현

import java.util.Arrays;

public class Main{
    private static String[] capitalMethod(String str1, String str2){
        String UpperChange = str1.toUpperCase();
        String LowChange = str2.toLowerCase();

        // 리턴 값 2개를 저장할 배열 변수 선언
        String [] ret = {UpperChange,LowChange};
        return ret; // 배열만 리턴
    }

    public static void main(String[] args) {
        // 반환 값  O, 받는 인자 값 O
        // 반환값이 있다는 것 -- > 메서드(호출) 호출에 따른 리턴 값이 있다는 것 --> 호출부에서 리턴값을 받는 변수 정의.
        String[] result = capitalMethod("korea","USA");

        System.out.println(result); // 배열명을 찍으면 주소값이 출력됨.
        System.out.println(Arrays.toString(result));
    }
}
profile
컴퓨터공학과에 재학중이며, 백엔드를 지향하고 있습니다. 많이 부족하지만 열심히 노력해서 실력을 갈고 닦겠습니다. 부족하고 틀린 부분이 있을 수도 있지만 이쁘게 봐주시면 감사하겠습니다. 틀린 부분은 댓글 남겨주시면 제가 따로 학습 및 자료를 찾아봐서 제 것으로 만들도록 하겠습니다. 귀중한 시간 방문해주셔서 감사합니다.

0개의 댓글