ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (국비교육) 11 - 클래스 생성(동물원) + 참조값 + 객체특징 + Run Configurations + UP&DOWN + 타노스 손가락
    개발/국비교육 2023. 6. 15. 17:49

    ■ 사람 클래스 만들어보기

     

     

    사람 클래스에서 필드와 메소드를 생성한다.

    필드에는 사람에게 필요한 정보를 입력한다. (이름, 나이, 성별, 주민번호, 주소)

    메소드에는 객체의 행동을 만들어준다. (자기, 말하기, 일하기, 먹기)

     

    ※ 접근제어자

    - public 

    - package

    - private

    - protected

     

     

    사용자에게 각 정보를 입력받을 수 있도록 input() 이라는 메소드를 만들어준다.

     

    입력받은 내용을 각 필드값으로 저장해주고,

    print() 메소드에서는 이러한 필드값을 출력하게 만들어준다.

     

     

    실행을 위해 메인 메소드에 human 이라는 객체를 인스턴스화(객체생성) 해주고,

    human.메소드 이름을 통해 각 메소드를 실행해준다. 

     

     

    ■ 객체의 참조값

     

     

    객체 h 를 생성하고 man 이라는 배열을 만들어준다.

    이는 각각의 주소값을 가지고 man 은 또 3개의 배열을 가지고 이는 각각 다른 주소값을 가진다.

    따라서 초기에는 5개의 각각 개별의 주소값을 가진다.

     

    그러나 man[ 0 ] = h 를 하게 되면 man [ 0 ] 이 h 값을 참조하게 되어 주소값이 h 와 동일하게 변경된다.

    마찬가지로 man[ 1 ] = man [ 0 ] 을 하게 되면 동일하게 h 값을 참조하게 된다.

    3가지의 주소값만 볼 수 있다. 

     

     

    man[ 0 ] 과 man[ 1 ] 은 h를 참조하기 때문에 name 메소드를 부르게 되면

    h.name 과 동일하게 홍길동이 출력된다.

     

     

    h == man[ 1 ] 를 하면 true, h == man[ 2 ] 를 하면 false 가 나온다.

    왜냐하면 R type 에서는 객체의 값을 비교하는 것이 아닌 객체(주소값) 비교하기 때문이다.

     

     

    h 를 참조했던 man[ 1 ] 에 새로운 객체값을 부여하면 새로운 주소를 받게 됩니다.

     

    Object 타입이 java 에서 가장 큰 타입이기 때문에 모든 타입으로 입력값을 설정 가능합니다.

     

    따라서 다른 변수에 arr01[ ] 대입하기 위해서는 cast 처리가 반드시 필요합니다.

    왜냐하면 arr01[ ] 가장 큰 값이기 때문입니다. 

     

    ■ 동물원 만들기 

     

     

    zoo 패키지에 개, 고양이, 쥐, 말 필드와 메소드를 각각 부여해준다.

     

     

    새롭게 Cat 이라는 class 를 만들었는데 생성되지 않는다.

    그 이유는 이미 zoo 라는 패키에서 Cat 이라는 클래스를 생성했기 때문이다. 

     

    따라서 이전에 zoo 에 있던 Cat 클래스를 삭제하면 오류가 사라진다.

     

     

    Human class 에서 tom.sleep() 메소드를 실행하면 오류가 뜬다.

     

     

    왜냐하면 zoo 패키지에 있는 class Cat 에 sleep() 메소드의 접근제어자 public 이 빠졌기 때문이다.

    패키지를 넘어서 필드와 메소드를 이용하기 위해서는 반드시 public 접근제어자가 필요하다.

     

     

    마찬가지로 Human  class 에서 name을 불러와도 뜨지 않는다. 

     

     

    필드값에도 public 이 빠졌기 때문이다.

    public 을 입력해주면 오류 없이 실행이 가능하다.

     

    하지만 이러한 작업은 번거롭다.

    따라서 웬만하면 같은 패키지에 생성하여 public 을 안붙여도 실행할 수 있게 설정해준다. 

     

    * 선조 만들기 

     

     

    모든 동물들이 자는 행동을 취하게끔 설정하고자 한다.

    이를 위해서 반복문을 설정해서 출력할 수 있는데 여기서 배열을 출력하면 다음과 같이 오류가 뜬다.

     

    왜냐면 Dog 로 캐스트 처리하게 되면 나머지  Cat, Mouse, Horse 는 캐스트 처리되지 않기 때문이다.

     

    우리는 선조 클래스를 설정하여 이를 해결할 수 있다.

     

     

    각 클래스마다 sleep() 메소드가 반복되는 것을 선조 클래스를 만들어 반복을 줄일 수 있다.

    선조 클래스 Ancestor 를 새롭게 만들어 주고 그 안에 반복할 메소드 sleep() 를 넣어준다.

     

    class에서 extends Ancestor 를 적어준다. 여기서 extends 는 확장한다는 의미이다. (확장팩)

     

     

    이후 반복문에 타입을 Ancestor class 로 변경하고 실행시켜주면

    우리가 원하는 모든 동물들이 sleep() 하는 메소드를 이용하여 출력할 수 있다. 

     

    ■ 객체지향 특징

     

    - 캡슐화(= 보호 = 보안) : 관련된 데이터(필드)와 기능(메소드)를 하나의 묶음으로 처리

     

     - 상속(= 코드 재활용)

    : 이미 작성된 클래스(부모)를 이어받아서 새롭게 만드는(자식) 것
      자식 클래스는 부모 클래스의 모든 속성(필드)과 동작(메소드)를 사용할 수 있다.
      필요한 기능은 자식 클래스에서 추가해 사용한다.

     - 추상화

    : 불필요한 것을 제외하고, 필요한 것을 유지
      실제로 객체를 인스턴스화 할 때 필요한 내용을 남기고 나머지는 제외하는 것
     
     - 다형성

    : 객체의 동작이 변경되는 것
      파라미터나 상황에 따라 동작이 변경됩니다. 

     

    ■ 클래스 구성요소

     

    - 클래스(= 인스턴스를 발생시킬 수 있는 설계도 = 붕어빵 틀)
    - 인스턴스(= 결과물 = 붕어빵)
     EX) 자동차 설계도 -> 자동차

     

    1. 필드 = 변수 -> 클래스 변수 / 인스턴스 변수
    2. 생성자 
    3. 메소드 = 기능 

     

    ■ 노트북 만들기

     

     

    노트북을 생성하기 위해서는 기본 필드와 메소드를 생성한다.

     

    필드에는 노트북의 기본 속성으로 생각되는 game, power(전원), memory 설정한다.

     

    메소드에는 게임을 구동하는 runGame(), 전원여부 power(), 메모리 추가 더해주는 addMemory를 설정한다.

     

    우리는 runGame() 이 true 일 경우 구동을 시켜준다.

    왜냐하면 밑에 나오는 power() 에서 거짓을 경우 키고 이를 반전시켜주기 때문이다.

     

    전원 여부를 확인하는 메서드 power() 도 만들어 준다.

    위에 나오는 power 는 필드값은 boolean 으로 설정되어 있다.

    boolean 의 기본 값은 false 로 우리는 false 일 경우 전원을 키는 것으로 설정한다.

    이후  if 와 else 구문을 나오면 power 값을 반전시켜 준다.

     

    기본으로 설정돼 있는 memory 에서 일정 메모리가 추가 되는 것은 addMemory 메소드를 통해 추가한다.

    memory 값에 입력받는 값을 추가하도록 설정하고 이를 출력하도록 하면 된다. 

     

     

    필드와 메소드를 구성하고 출력하기 위해서 객체 gram 과 sam 을 생성해준다.

     

    1. gram 의 출력값

     

    먼저 gram 에서는 메모리값을 출력받아 나타낼 수 있고 이는 2048로 나온다.

     

    game 이름이 LOL 로 정해지고 power() 메소드가 호출된다.

    호출된 power() 메소드는 if 조건으로 참 거짓을 구분하고 boolean 초기값이 false 로 "켭니다." 가 출력된다.

    출력 이후 필드 power 값이 반전돼 true 가 된다.

     

    runGame() 으로 넘어가면 이전에 power 가 true 로 저장됐기 때문에 "LOL을 구동합니다." 가 출력된다.

     

    addMemory 메소드를 실행하면 add 값을 입력받게 되고, 입력받은 add 값이 기존 memory 값과 합쳐져

    "업그레이드 되었습니다. 3072" 가 출력된다.

     

    2. sam 의 출력값

     

    sam 에서도 메모리값을 출력받아 나타낼 수 있고 이는 2048로 나온다.

     

    game 이름이 D4 로 정해지고 runGame 메소드가 호출된다.

    runGame() 으로 넘어가면 이전에 power 가 true 로 저장됐기 때문에 "D4을 구동합니다." 가 출력된다.

     

    ■ 메소드(= function) 


    자바는 클래스를 정의하고 정의된 클래스의 인스턴스를 만들어서

    여러가지 기능적인 일을 처리하도록 만들어진 객체지향언어이다.

    위에서 기능적인 일을 담당하는 것이 메소드이다.
    메소드는 우리가 산수시간에 배웠던 함수와 같은 개념이다.

    특정 기능(일)을 수행하도록 메소드에서 미리 정의하고
    그 일이 필요할 때마다 해당 메소드를 호출해서 사용한다.  

    이렇게 하는 주 이유는 같은 일을 수행하는 것을 반복적으로
    코딩하지 않아도 되는 큰 이점이 있기 때문이다.

     * 메소드의 기본 형식

     

    [접근제어자] 리턴타입 메소드명 ( [파라미터,....] ) {
                    구현부 : 메소드가 하는 일 = 명령어의 집합
    }

     

    [ ]는 없어도 되는 부분이다. 나머지는 필수

     

    - 파라미터 : 메소드 수행에 필요한 입력값을 저장하는 변수

     

    ■ work 메소드 이용해서 출력하기

     

     

    Animal 클래스에 메소드를 생성하여 메인 메소드에서 이를 호출하여 사용할 수 있도록 설정한다.

     

    메인 메소드에서 annimal 객체를 생성하고 각 동물들이 있는 배열을  arraSTR 에 생성한다.

     

    String[ ] arrSTR = { "고양이", "개", "쥐", "토끼"}

     

    각 배열에 있는 동물들을 출력하는 메소드를 work() 로 만들고자 한다.

     

    work() 는 arrSTR 배열 형태를 호출할 것으로 파라미터를  String[ ] arr01 로 설정한다.

    배열을 반복하여  출력하는 for 문을 작성한다.

     

    이제 메인 메소드에서 animal.work(arraSTR); 을 통해 메소드 호출이 가능하고

    배열 0 ~ 3 까지의 값 고양이, 개, 쥐, 토끼 출력이 가능하다.

     

    ■ Run Configurations 사용하기

     

     

     

    이클립스에서 프로그램을 실행할 때 매개값을 주고 실행하는 방법은 Run Configurations 을 사용한다.

     

    Rnu -> Run Configurations -> Arguments 에서 우리가 배열에 넣고자 하는 값을 넣을 수 있다.

    띄어쓰기(=공백)을 통해 각 배열을 분리한다.

     

    따라서 사과, 배, 포도, 감, 토마토 가 출력된 것을 볼 수 있다. 

     

     

    * 사용 10 번 반복하기 

     

    사용이라는 글자와 같다면 10번 반복하게 만들어주고자 한다.

    먼저 배열 0의 값을 사용, 1의 값을 10 으로 설정해준다.

     

     

    메인 메소드에서 .equals 를 사용해 만약 사용이라는 글씨와 같다면 "arg를 사용합니다." 를 출력시킨다.

    또한 우리가 배열 1번째를 10으로 반복횟수로 적었으니 이를 for 문을 통해 이용해준다.

     

    i = 0 이므로 우리는 배열 1번째 값 즉 10보다 작게 돌리면 배열 0 ~ 9 까지 돌게 됨으로 총 10번을 돌게 된다.

    그러나 arg[ 1 ] 의 값은 "10" 으로 숫자로 보이지만 사실은 String 타입이다. 

     

    String 타입을 정수 int 로 변경해줘야 하는데 여기서 Integer.parseInt() 가 사용된다.

    Integer.parseInt() 는 괄호안에 있는 String 을 정수로 바꿔주는 역할을 하며,

    따라서 arg[ 1 ] 의 값 "10" 이 int 10으로 변경돼 오류 없이 for문이 작동한다.

     

    만약 여기서 사용이라는 값과 동일하지 않다면 else 로 빠져나오게 설정해준다.

     

     

    Boolean.parseBoolean() 은 String 타입을 boolean 타입으로 변경해주는 메소드이다. 

    TRUE, true, True 이외의 값은 모두 false 로 인식합니다.

     

    [JAVA] eclipse에서 프로그램을 실행할 때 매개값을 주고 실행하려면? (tistory.com)

     

    [JAVA] eclipse에서 프로그램을 실행할 때 매개값을 주고 실행하려면?

    2020/10/09 - [Programming Language/Java] - [JAVA] main()메소드의 매개값 String[]args란 ? [JAVA] main()메소드의 매개값 String[]args란 ? public static void main(String[] args){ ... } java class로 프로그램을 실행하면 JVM은 길이가

    bskwak.tistory.com

     

    ■ 메소드 리턴 타입

     

    메소드의 리턴 타입은 크게 두가지로 나뉩니다.
    리턴할 내용이 없을 때는 void 라고 적어줍니다. 

    만약 리턴할 내용이 있다면 반환되는 데이터의 데이터 타입을 void 자리에
    적어야 합니다. 

    명령문 끝에 return 이라고 적고 반환할 데이터를 적어줍니다.

    (기본자료형 / 참조 자료형이나 공통) 

     

     

     

    void 타입의 리턴일 때는 메소드가 값을 리턴하게 되고,
    반환값이 없어야 하는데 있기 때문에 에러가 납니다. 

     

     

    result + "입니다." 는 String 타입이기 때문에 리턴 타입을 String 으로 설정해야 한다.

     

     

     

     메소드 실행 중 리턴이 된다면 리턴 이후의 코드는 무시됩니다.

     

    * add 메소드 출력하기

     

     

    두 개의 정수값을 입력받아 리턴하는 add() 메소드를 만든다.

    파라미터 부분에 정수형으로 2개의 값을 받고 이를 합친 것을 result 로 저장해준다.

    return 값을 result 로 지정해주면 우리가 add 메소드에서 2개의 값을 입력했을때 합한 결과값을 얻을 수 있다. 

     

    * ! 값 나타내기

     

    팩토리얼은 입력받은 숫자에서 거꾸로 1까지 곱하는 것을 의미한다.

     

    팩토리얼 계산법을 메소드로 만들어보면

    만약 5라는 값을 입력받으면 우리는 5*4*3*2*1 의 값을 출력받아야 한다. 

     

    결과값은 result 로 정의해준다.

    for 문을 통해 하나씩 적어지는 값을 만들어주면

     

    여기서 고민은 i 값은 점점 작아지게 설정해주고 이 값이 1까지 나오도록 설정하면 i > 0 보다 크면 된다.

    i 값 설정이 어려운데, 입력받은 값 num 을 계속 사용하면서 i 를 반복 곱해줘야 함으로

    i  는 num-1 로 설정하여 num *= i 를 통해 num 을 곱하면서

    num-1 값을 계속 반복 곱하게 만들어주면 우리가 원하는 결과를 얻을 수 있다.

     

    * 빵만들기 

     

     

     

    빵 만드는 메소드도 마찬가지이다.

    정수형 숫자를 입력받아 입력 값만큼 반복하는 for 반복문을 통해 출력할 수 있다. 

     

    ■ 메소드 속 변수 사용

     

    t.variable() 에 a=0 값을 넣었지만 이 값은 variable 메소드의 a 와는 별개이고 사용되지 않는다.

    따라서 variable  자체 내 10에서 후행증감에 따라 리턴값 a 를 출력하여 11이 나온다.

     

    별도로 num이 쓰이지 않기 때문에 variable 에서 int num을 빼도 무방하다.

     

    ■ UP&DOWN 만들기

     

     

    https://codingdojang.com/scode/711?answer_mode=hide 

     

    코딩도장

    프로그래밍 문제풀이를 통해서 코딩 실력을 수련

    codingdojang.com

     

    ■ 타노스 손가락

     

     

    package oop;
    
    import java.lang.reflect.Array;
    import java.util.Arrays;
    import java.util.Iterator;
    import java.util.Scanner;
    
    //입력값 배열로 받기
    //랜덤으로 반 삭제
    //출력하기
    
    public class Finger {
    	public static void main(String[] args) {
    
    		Scanner sc = new Scanner(System.in);
    
    		System.out.println("원하는 숫자를 입력해주세요 : ");   
    		String input = sc.nextLine();       //입력값 배열로 받기
    
    		String[] temp = input.split(" ");   //공백 기준으로 나눠서 temp 배열에 넣기
    		
    		int[] arr01 = new int[temp.length];  //temp.length 만큼 int arr01 배열에 넣어주기
    		for (int i = 0; i < arr01.length; i++) { // String 값으로 받은 temp[] 값 int 로 변경해주기
    			arr01[i] = Integer.parseInt(temp[i]); // ※ string -> int로 변경 Integer.parseInt
    		}
    		
    		System.out.println(Arrays.toString(arr01));
    		
    		int NewLength;
    		if (arr01.length % 2 == 0) { //짝수일 경우 절반 날리기
    			NewLength = arr01.length / 2;
    		} else {
    			if (Math.random() > 0.5) { //홀수일 경우 절반 혹은 절반보다 더 날리기
    				NewLength = (arr01.length / 2);
    			} else {
    				NewLength = (arr01.length / 2) + 1;
    			}
    		}
    
    		int[] arr02 = new int[NewLength];
    
    		for (int i = 0; i < NewLength; i++) {
    			arr02[i] = arr01[ (int) (Math.random() * arr01.length) ];  //arr01[]을 랜덤으로 arr02에 넣어주기
    			for (int j = 0; j < i; j++) {  //중복값 제거
    				if (arr02[i] == arr02[j]) {
    					i--;
    					break;
    				}
    			}
    		}
    		System.out.println(Arrays.toString(arr02)); //배열출력
    	}
    }

     

     

     

     

     

    https://codingdojang.com/scode/592?answer_mode=hide 

     

    코딩도장

    프로그래밍 문제풀이를 통해서 코딩 실력을 수련

    codingdojang.com

     

    https://summer-light.tistory.com/35

     

    [코딩도장] N592 타노스의 핑거 스냅

    https://codingdojang.com/scode/592 package may26; import java.util.Arrays; public class Tanos { public static void main(String[] args) { int[] Array = {2, 3, 1, 6, 5, 7}; int newLength; if(Array.length%2==0) { newLength = (Array.length)/2; } else { if (Mat

    summer-light.tistory.com

     

Designed by Tistory.