ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 객체지향(3) - 인스턴스 메소드
    JAVA 2021. 3. 14. 23:04

    안녕하세요~ 이번 포스팅은 

    www.youtube.com/watch?v=E2FHXYr61IU&list=PLq8wAnVUcTFX4E2NplMvJfqlcgAeF_BxK&index=4

    님의 강의를 기반으로 내용정리를 하겠습니다. 

     

     

    이번 강의의 주요한 내용은

     

    1. 메소드와 함수를 구분할 수 있다 . 

    2. static 과 this의 사용 여부를 정확하게 설명할 수 있다.

     

    위 2가지만 알면 성공한 강의입니다.

     

    자그럼 가시죠!

     

    [그림]1

    [그림1]  저희는 지금까지 static이란 함수를 나타날때 쓴다고 배웠습니다.

    오늘에서야 static의 의미를 배우는데요! 

     

    기존 함수와 새로운 함수 모두 다 메소드라고 부르는데, 모양이 다르니 다른 말을 불러야 합니다

     

    따라서 기존함수는 static이라는 것을 사용하기 때문에 static메소드, 아래는 instance 메소드 라고 부릅니다.

     

     

    static 메소드는 고전적인 함수, 모든 값은 파라미터를 통해 연결받는 특징이 있습니다.

    모든 데이터가 파라미터로 전달되어 있기 때문에, 파라미터를 통해 exams와 current를 사용할 수 있게 됩니다. 

     

     

    instance 메소드는 객체를 통해서 호출되는 함수이고 ExamList에서 객체를 넘겨받게 되어있습니다.

    [그림1]을 보면 instance메소드는 this=list인 셈입니다.

     

     

    그럼 코딩을 통해 실습을 진행해보도록 합시다!

     

    [그림2]

    [그림2] 캡슐화에서 진행했던 파일들을 불러와 메소드 패키지에 넣습니다.

    [그림3]

    [그림3] Program, ExamList class에서 기존 static메소드를 인스턴스 메소드로 바꾸는 작업을 진행하도록 하겠습니다!

     

    방법을 같이 알아봅시다!

     

    1.  inputList메소드의 static을 지운다

     

    2.  inputList메소드의 매개변수를 지운다

     

    3. Program class에서 case1의 ExamList.inputList(list);   

                                           ->  list.inputList(); (인스턴스메소드)로 바꾼다

    [그림4]

    인스턴스 메서드 생성 성공!

     

    하지만

     

     [그림5]와 같은 오류가 발생합니다.

    [그림5]

     

    위 오류는 왜 발생했을까요?? 

     

    바로 기존 static메소드에서 inputList가 매개변수로 넘겨받았던 list가 없어졌기 때문이죠! 후훗

     

     

    그럼 어떻게 고칠까요!! 바로 this를 통해 고치면 되겠죠~ 이과정은 스킵하겠습니다

     

     

     

    여러분은 어떤 방법이 가시적으로 잘 들어오나요?

     

    [그림6]

     

    case1 방식 즉, 인스턴스메서드를 이용하는게 더 가시적으로 잘 들어오는 것같습니다!

     

    static메소드를 사용해도, instance 메소드를 사용해도 기능및 역할에 대해서는 차이가 없다고 합니다.

     

    다만, 사람들이 많이 찾고 사용하는 이유가 있겠죠

     

    나는 특별한사람이야! static을 써야지 라는 생각은 하지말아~~ 

     

    보편성을 따르도록 합시다!

     

    자, 그럼 이제 case2의 경우도 instance메소드로 바꾸는 연습을 해봅시다.

     

     

     

    지금까지 코드를 올리고 마무리하겠습니다

     

     

     

     

    package part3.ex2.메소드;
    
    import java.util.Scanner;
    
    public class Program {
    
    	public static void main(String[] args) {
    
    		ExamList list = new ExamList();
    
    		list.init();
    		//
    
    		int menu;
    		boolean keepLoop = true;
    
    		while (keepLoop) {
    			menu = inputMenu();
    
    			switch (menu) {
    			case 1:
    				// ExamList.inputList(list);
    				// ExamList에 있는 inputList를 사용하겠다.
    				list.inputList();
    				break;
    			case 2:
    				list.printList();
    				break;
    
    			case 3:
    				System.out.println("Bye~");
    
    				keepLoop = false;
    				break;
    
    			default:
    				System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지 입니다.");
    			}
    		}
    	}
    
    	static int inputMenu() {
    		Scanner scan = new Scanner(System.in);
    
    		System.out.println("┌───────────────────────────┐");
    		System.out.println("│           메인 메뉴          │");
    		System.out.println("└───────────────────────────┘");
    		System.out.println("\t1. 성적입력 ");
    		System.out.println("\t2. 성적출력 ");
    		System.out.println("\t3. 종료 ");
    		System.out.println("\t선택> ");
    		int menu = scan.nextInt();
    
    		return menu;
    	}
    }

     

    package part3.ex2.메소드;
    
    import java.util.Scanner;
    
    public class ExamList {
    	Exam[] exams;
    	int current;
    	
    
    	  void printList() {
    			this.printList(this.current);
    		}
    	
    	 
    	 
    	 
    	  void printList(int size) {
    		System.out.println("┌───────────────────────────┐");
    		System.out.println("             성적  출력         ");
    		System.out.println("└───────────────────────────┘");
    		System.out.println();
    
    		//int size = list.current;
    		Exam[] exams = this.exams;
    		
    		for (int i = 0; i < size; i++) {
    			Exam exam = exams[i];
    			// 변수가 반복문 안에서 사용되어도 큰 문제 ㄴㄴ
    			int kor = exam.kor;
    			int eng = exam.eng;
    			int math = exam.math;
    
    			int total = kor + eng + math; // exams[0].kor + ...
    			float avg = total / 3.0f;
    
    			System.out.printf("국어 %d\n", kor);
    			System.out.printf("영어 %d\n", eng);
    			System.out.printf("수학 %d\n", math);
    
    			System.out.printf("총점 : %3d\n", total);
    			System.out.printf("평균 : %6.2f\n", avg);
    			System.out.println("─────────────────────────────");
    
    		}
    	 }
    	 
    
    	  void inputList() {
    				Scanner scan = new Scanner(System.in);
    
    				System.out.println("┌────────────────────────────┐");
    				System.out.println("           성적  입력            ");
    				System.out.println("└────────────────────────────┘");
    				System.out.println();
    
    				int kor, eng, math;
    
    				do {
    					System.out.printf("국어:");
    					kor = scan.nextInt();
    
    					if (kor < 0 || 100 < kor)
    						System.out.println("국어성적은 0~100 까지의 범위만 입력 가능합니다.");
    
    				} while (kor < 0 || 100 < kor);
    
    				do {
    					System.out.printf("영어:");
    					eng = scan.nextInt();
    
    					if (eng < 0 || 100 < eng)
    						System.out.println("영어성적은 0~100 까지의 범위만 입력 가능합니다.");
    
    				} while (eng < 0 || 100 < eng);
    
    				do {
    					System.out.printf("수학:");
    					math = scan.nextInt();
    
    					if (math < 0 || 100 < math)
    						System.out.println("수학성적은 0~100 까지의 범위만 입력 가능합니다.");
    
    				} while (math < 0 || 100 < math);
    
    				Exam exam = new Exam();
    				// 실제 국영수방을 만들어준다
    
    				exam.kor = kor;
    				exam.eng = eng;
    				exam.math = math;
    				
    				Exam[] exams = this.exams;
    				int size = this.current;
    				
    				if(exams.length == this.current) {
    					Exam[] temp = new Exam[size + 5];
    					
    					for(int i=0; i<size;i++)
    						temp[i] = exams[i];
    					
    					this.exams = temp;
    				}
    				
    				this.exams[this.current] = exam;
    				this.current++;
    			}
    	 
    
    	public void init() {
    		
    		exams = new Exam[3];
    		current =0; 
    		
    	}
    
    }
    
    
    
    
    

     

    
    package part3.ex2.메소드;
    
    public class Exam {
    
    	int kor;
    	int math;
    	int eng;
    }
    

    'JAVA' 카테고리의 다른 글

    [JAVA] 객체지향(5) - UI코드의 분리  (0) 2021.03.17
    [JAVA] 객체지향(4) - GETTER, SETTER  (0) 2021.03.17
    [JAVA] 객체지향(2)  (0) 2021.03.11
    [JAVA] 객체지향(1)  (0) 2021.03.11
    [JAVA] 구조적 프로그래밍(8) - 오버로드 함수  (0) 2021.03.08

    댓글

Designed by Tistory.