ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TECHIT 앱 스쿨 2기: Android 6일차 (23.05.01)
    [THEC!T] 앱 스쿨2기 : Android 2023. 5. 1. 23:00
    728x90

    자료 출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 내용

     

    시작은 

    패키지에 대하여 설명해주셨습니다.

    패키지의 개념은 매우 요약하여 설명하자면 

    하나의 파일 안에 코드가 많이 작성되어 있으면 가독성이 좋지 않아 원하는 부분을 찾기 힘들기에

    쉽게 관리하기 위하여 파일(class)들을 나누어 관리하며, 나눈 파일들을 관리하는 것이 패키지라고 하셨습니다.

    자바에서는 패키지를 폴더 단위로 구분합니다.

    같은 패키지에 있는 클래스는 자유롭게 사용가능하며, 다른 패키지에 있는 클래스는 import문을 사용하여 사용 가능합니다.

    그리고 패키지에 포함된 클래스들을 다른 곳 사용할 때는 상단에 어디에 포함되어 있는지 기재해야 합니다.(import문)

    만약 패키지가 다르지만 클래스명이 동일할 경우 오류가 발생하며, 꼭 사용해야할 경우에는 클래스 명 앞에 패키지 명을

    반드시 붙혀서 사용해야 합니다.

     

    패키지 명을 정할 때는 소문자만을 사용하여 작성하며, 중복된 이름을 사용하지 않기위해 회사일 경우 보통 회사명 반대로 작성한다고 하셨습니다. 

     

    마지막으로 앞으로 작성에 있어 패키지 쓰는 것에 익숙해져야 하며, 파일을 패키지로 묶어서 관리하는 버릇을 들여야 된다고 하셨습니다.

     

    패키지에 대한 설명 다 해주신 후 조별끼리 모여 코드를 짜는 시간을 가졌었는데 맨날 혼자 코드를 작성하다가 다른 사람들과 같이 작성을 하려는 바보가 된 느낌이였습니다. 분명 강사님께서 말씀해주셨던거 같은데 기억이 안나더라구요...ㅠㅜ

    근데 저 뿐만 아니라 다른 조원들도 비슷한 느낌이였습니다.  그렇게 어색한 시간을......

     

    그리고나서 강사님께서도 예상을 하셨던 문제였는지 조원들과의 코드 작성 시간이 끝난 후 틀을 말씀해 주셨었습니다.

    첫번째는 문제 분석

    두번째는 기능 정리

    세번째는 기능 구현을 위해 필요한 변수

    네번째는 클래스를 설계(주석으로 하며, 설계 단계이기에 작성x)

    마지막으로는 클래스 내부의 변수와 메서드를 정의.

    하는 단계로 이야기를 하면 된다고 하셨습니다.

     

    그리고 드디어 배열에 대하여 알려주셨습니다.

    package com.test.main;
    
    public class MainClass {
    
    	public static void main(String[] args) {
    		// 정수형 기억장소 10개를 관리하는 배열.
            // 0 부터 9까지
            int [] arr1 = new int[10];
            // 값을 지정
            arr1[0] = 100;
            arr1[1] = 200;
            arr1[2] = 300;
            // 사용한다.
            System.out.printf("arr1[0] : %d\n", arr1[0]);
            System.out.printf("arr1[0] : %d\n", arr1[0]);
            System.out.printf("arr1[0] : %d\n", arr1[0]);
            //---------------추가
            // 10개를 생성한 뒤 0~2까지 값을 넣어주었는데 다른 곳은 어떻게 되어 있을까?
            for(int i = 0; i < 10; i++){
            	System.out.printf("arr1[%d] : %d\n",i,arr1[i]);
            }
            // 출력 결과
            /*
            0으로 초기화 되어 있다.
            arr1[0] : 100
            arr1[1] : 200
            arr1[2] : 300
            arr1[3] : 0
            arr1[4] : 0
            arr1[5] : 0
            arr1[6] : 0
            arr1[7] : 0
            arr1[8] : 0
            arr1[9] : 0
            */
            // 배열 생성 시 값을 넣어주는 경우
            int [] arr2 = {1, 2, 3};
            System.out.printf("arr2[0] : %d\n", arr2[0]);
            System.out.printf("arr2[1] : %d\n", arr2[1]);
            System.out.printf("arr2[2] : %d\n", arr2[2]);
            
            for(int value : arr2){
            	System.out.printf("value : %d\n", value);
            }
            // 출력 결과
            // arr2[0] : 1
            // arr2[1] : 2
            // arr2[2] : 3
            // value : 1
            // value : 2
            // value : 3
            
    	}
    
    }
    package com.test.main;
    
    public class MainClass {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		// 객체의 ID를 담을 배열을 생성한다. 
    		TestClass1 [] arr3 = new TestClass1[3];
    		// 위의 배열은 객체의 ID를 담을 수 있는 참조 변수 3개를
    		// 가진 배열을 생성한 것이다.
    		// 이에 배열 생성 후 객체를 생성하여 담아줘야 한다.
    		arr3[0] = new TestClass1();
    		arr3[1] = new TestClass1();
    		arr3[2] = new TestClass1();
    
    		for(TestClass1 t1 : arr3) {
    			System.out.printf("t1 : %s\n", t1);
    		}
    		
    		
    		// 객체가 관리하는 기억장소의 개수 출력
    		System.out.printf("arr3 length : %d\n", arr3.length);
    	}
    
    }
    
    class TestClass1{
    	int memberA;
    }

    그리고 조원들과 강사님께서 내주신 문제에 대하여 코드를 작성하는 시간을 가졌었습니다.

    저와 조원들은 내주신 문제에 대해 이야기를 하며, 코드를 작성하였었으나, 아직 오전에 진행했을때보다는 원활한 듯 하였으나, 아직 실력이 부족하여 해당 문제에 대하여 완성을 하지는 못하였었습니다.

    (머리로는 구성이 되는데 코드로는 작성이 안되는...... 슬픈 현실...)

    하지만 연습을 하면서 실력이 늘어가야기에 강사님이 내주신 문제와 코드를 참고하여 새로운 문제를 작성해보도록 하겠습니다.

    문제는 하기와 같습니다.  값들은 입력받기에 표현 형식을 표현하기 위해 임의값으로 넣었습니다.

    새로 푸는 문제
    자동차 n대의 데이터를 입력받는다.
    모델, 키로수, 연비, 연료통양, 안전 점수를 받는다.
    정보 입력이 완료되면 다음과 같이 출력되게 한다.
    자동차 객체는 배열에 담아 관리한다.
    
    자동차 에 대한 정보는 객체
    자동차  객체 
    ------------------------
    이름 : 이클래스
    키로수 : 1
    연비 : 100
    연료통양 : 80
    안전점수 : 70
    
    이름 : 에이클래스
    키로수 : 1
    연비 : 100
    연료통양 : 80
    안전점수 : 70
    
    이름 : 에스클래스
    키로수 : 1
    연비 : 100
    연료통양 : 80
    안전점수 : 70
    
    종목별 총점
    연비 총점 : 100
    연료통양 총양 : 80
    안전점수 총점 : 70
    
    종목별 평균
    평균 연비 : 100
    평균 연료통양 : 80
    평균 안전점수 : 70

    강사님 께서 작성한 코드 스타일로 코드를 제 나름대로 작성해 보았습니다.

    package com.studty.lst;
    import java.util.Scanner;
    
    public class MainClass {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner scan = new Scanner(System.in);
    		
    		// 자동차 객체를 생성한다.
    		Benz benz = new Benz();
    		
    		// 입력을 받을 자동차의 대수정보를 받는다.
    		benz.carCount(scan);
    		
    		//System.out.printf("자동차 대수 : %d\n", car.carcount);
    		
    		// 자동차의 정보를 입력 받는다.
    		benz.saveCarInfo(scan);
    		
    		// 입력 받은 자동차의 정보를 출력한다.
    		benz.outCarInfo();
    		
    		// 종목 별 총점을 출력한다.
    		benz.printTotalPrint();
    		
    		// 종목 별 평균을 출력한다.
    		benz.printAvg();
    	}
    
    }
    
    // 자동차의 정보를 입력 받는다.
    class Benz {
    	// 자동차 대수를 저장할 변수
    	int carCount;
    	// 자동차 정보를 담을 배열의 변수
    	Car [] carArray;
    	// 자동차 대수를 입력받아 객체를 생성하는 메서드
    	public void carCount(Scanner scan) {
    		System.out.print("입력할 자동차의 대수를 입력하세요. : ");
    		carCount = scan.nextInt();
    	}
    	// 자동차의 정보를 입력 받아 저장하는 메서드
    	public void saveCarInfo(Scanner scan) {
    		// 입력받은 수 만큼 객체를 생성한다.
    		carArray = new Car[carCount];
    		for(int i = 0; i < carCount; i++) {
    			carArray[i] = new Car();
    		}
    		
    		for(Car c1 : carArray) {
    			c1.inputCarInfo(scan);
    		}
    	}
    	// 자동차의 정보를 출력하는 메서드
    	public void outCarInfo() {
    		for(Car c1 : carArray) {
    			c1.printCarInfo();
    		}
    	}
    	// 종목별 총점을 출력하는 메서드
    	int TotalfuelScore = 0;
    	int TotalfuelTankScore = 0;
    	int TotalsafetyScore = 0;
    	public void printTotalPrint() {
    		for(Car c1 : carArray) {
    			TotalfuelScore += c1.fuel;
    			TotalfuelTankScore += c1.fuelTank;
    			TotalsafetyScore += c1.safetyScore;
    		}
    		System.out.println("종목별 총점");
    		System.out.printf("연비 총점 : %d \n",TotalfuelScore);
    		System.out.printf("연료통양 총양 : %d \n",TotalfuelTankScore);
    		System.out.printf("안전점수 총점 : %d \n",TotalsafetyScore);
    		System.out.println();
    	}
    	
    	// 종목별 평균을 구하는 메서드
    	public void printAvg() {
    		System.out.println("종목별 평균");
    		System.out.printf("연비 평균 : %d \n",TotalfuelScore/carCount);
    		System.out.printf("연료통양 평균 : %d \n",TotalfuelTankScore/carCount);
    		System.out.printf("안전점수 평균 : %d \n",TotalsafetyScore/carCount);
    		System.out.println();
    	}
    	
    }
    
    // 자동차 정보를 입력 및 출력하는 클래스
    class Car{
    	
    	String name; // 이름
    	int km; // 달린 키로수
    	int fuel; // 연비
    	int fuelTank; // 연료통양
    	int safetyScore; // 안전점수
    	
    	// 자동차 정보를 입력받는 메서드
    	public void inputCarInfo(Scanner scan) {
    		System.out.print("차 이름 : ");
    		name = scan.next();
    		System.out.print("달린 키로 수 : ");
    		km = scan.nextInt();
    		System.out.print("연비 : ");
    		fuel = scan.nextInt();
    		System.out.print("연료통양 : ");
    		fuelTank = scan.nextInt();
    		System.out.print("안전점수 : ");
    		safetyScore = scan.nextInt();
    		System.out.println();
    	}
    	
    	// 자동차 정보를 출력하는 메서드
    	public void printCarInfo() {
    		System.out.printf("차 이름 : %s\n",name);
    		System.out.printf("달린 키로 수 : %d\n",km);
    		System.out.printf("연비 : %d\n",fuel);
    		System.out.printf("연료통양 : %d\n",fuelTank);
    		System.out.printf("안전점수 : %d\n",safetyScore);
    		System.out.println();
    	}
    	
    }

    해당 코드를 설계 하고 작성하려하니 버릇이 안들어 있어서 그런지 시간이 거의 1시간 가까이 걸렸던 것 같습니다.

    이렇게.... 실력이 늘어가는 거겠죠.......제~~발~~!

     

    그리고 생성자에 대한 설명을 해주셨습니다.

    생성자는 클래스를 이용하여 객체를 생성할 때 무조건 동작하는 요소이며, 생성자는 반환 타입이 없고 클래스 이름과 동일하게 작성하며, 클래스를 통해 객체를 생성할 때는 반드시 생성자를 지정해야 합니다.

     

    생성자 

     

    만약 클래스를 만들 때 생성자를 작성하지 않으면 기본 생성자가 자동으로 추가 됩니다.

    기본 생성자 : 클래스 이름() { }

     

    매개 변수가 없는 생성자를 가지는 클래스

    package com.test.main;
    
    public class MainClass {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		// 생성자
    		// 클래스를 통해 객체를 생성할 때 무조건 동작하는 요소
    		// 생성자는 반환 타입이 없고 클래스 이름과 동일하게 작성해준다.
    		// 클래스를 통해 객체를 생성할 때는 반드시 생성자를 지정해야한다.
    
    		TestClass2 t2 = new TestClass2();
    		System.out.printf("t2 : %s\n", t2);
    	}
    }
    
    
    
    // 매개 변수가 없는 생성자를 가지는 클래스
    class TestClass2{
    	// 생성자
    	public TestClass2() { 
    		System.out.println("TestClass2의 생성자");
    	}
    	
    }
    
    // 출력결과
    TestClass2의 생성자
    t2 : com.test.main.TestClass2@5f8ed237

    매개 변수가 있는 생성자를 가지는 클래스

    package com.test.main;
    
    public class MainClass {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		// 생성자
    		// 클래스를 통해 객체를 생성할 때 무조건 동작하는 요소
    		// 생성자는 반환 타입이 없고 클래스 이름과 동일하게 작성해준다.
    		// 클래스를 통해 객체를 생성할 때는 반드시 생성자를 지정해야한다.
    		TestClass3 t3 = new TestClass3(100, 200);
    		System.out.printf("t3 : %s\n", t3);
    
    	}
    
    }
    
    // 매개 변수가 있는 생성자를 가지는 클래스
    class TestClass3{
    	// 생성자
    	public TestClass3(int a1, int a2) {
    		System.out.println("TestClass3의 생성자");
    		System.out.printf("a1 : %d\n", a1);
    		System.out.printf("a2 : %d\n", a2);
    	}
    }
    
    // 출력결과
    TestClass3의 생성자
    a1 : 100
    a2 : 200
    t3 : com.test.main.TestClass3@58ceff1

    매개 변수가 있는 생성자를 가지는 클래스

    하기에 작성한 생성자는 값을 모두 입력해야만 생성이 된다.

    package com.test.main;
    
    public class MainClass {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		// 생성자
    		// 클래스를 통해 객체를 생성할 때 무조건 동작하는 요소
    		// 생성자는 반환 타입이 없고 클래스 이름과 동일하게 작성해준다.
    		// 클래스를 통해 객체를 생성할 때는 반드시 생성자를 지정해야한다.
            
    		StudentClass s1 = new StudentClass("홍길동", 1, 100, 90, 80);
    		s1.printStudentInfo();
    	}
    
    // 학생클래스
    class StudentClass{
    	String name;
    	int grade;
    	int korean;
    	int english;
    	int math;
    	
    	public StudentClass(String name, int grade, int korean, int english, int math) {
    		// this : 객체의 멤버에 접근할 때 사용한다.
    		this.name = name;
    		this.grade = grade;
    		this.korean = korean;
    		this.english = english;
    		this.math = math;
    	}
    	
    	public void printStudentInfo() {
    		System.out.printf("이름 : %s\n", name);
    		System.out.printf("학년 : %d\n", grade);
    		System.out.printf("국어 : %d\n", korean);
    		System.out.printf("영어 : %d\n", english);
    		System.out.printf("수학 : %d\n", math);
    	}
    }

     

    오버로딩에 대하여 설명해주셨습니다.

    오버 로딩(Overloading)은 메서드나 생성자를 작성할 때 매개변수의 형태를 다르게 하여 같은 이름으로 여러개를 만들 수 있도록 제공되는 개념입니다.

    하기 코드는 매개변수의 형태만 다르게한 종류만 기재하였습니다.

     

    package com.test.main;
    
    public class MainClass {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		// Overloading
    		// 메서드나 생성자를 작성할 때 매개변수의 형태를 다르게 하여
    		// 같은 이름으로 여러개를 만들 수 있도록 제공되는 개념
    		
    		TestClass1 t1 = new TestClass();
            TestClass1 t2 = new TestClass();
            TestClass1 t3 = new TestClass();
            
            System.out.printf("t1.add(10,20) : %d\n",t1.add(10,20));
            System.out.printf("t1.add(10L,20L) : %d\n",t1.add(10L,20L));
            System.out.printf("t1.add(10.10,20.20) : %f\n",t1.add(10.10,20.20));
    
    	}
    
    }
    
    class TestClass1 {
    	
        public int add(int a, int b){
        	return a + b;
        }
        
        public long add(long a, long b){
        	return a + b;
        }
        
        public double add(double a, double b){
        	return a + b;
        }
    }
    
    // 출력 결과
    t7.add(10,20) : 30
    t8.add(10L,20L) : 30
    t9.add(10.10,20.20) : 30.300000

    그리고 이제 마지막으로 상속에 대한 설명과 다형성에 대한 설명을 해주셨습니다.

    상속은 다른 클래스에 있는 메서드 혹은 변수를 지금 작성하고 있는 클래스에 가져와서 사용하는 방법 중 하나입니다.

    자바에서는 다중 상속을 지원하지 않으며, 단일 상속만을 지원합니다.

    예시로 부모는 자식을 많이 가질 수 있지만 자식은 부모를 여러명 가질 수 없는 것처럼....(말이 이상하긴 한데...ㅋㅋㅋ)

     

    상속을 받는 클래스는 자식클래스(SubClass)  상속을 해주는 클래스는 부모클래스(SuperClass) 라고 합니다.

    기존 코드를 직접 손대지 않고 추가 혹은 수정이 가능하기에 자바 같이 객체 지향 프로그래밍에서는 굉장히 많이 사용하는 기법입니다.

     

     

    마지막으로 다형성과 오버라이딩에 대해서는 내일 더 자세하게 설명해주신다고 하셔서 설명을 듣고 내일 적을 수 있도록 하겠습니다.

     

     

    마무리

    오늘은 정말 객체지향프로그래밍의 맛을 찍먹(?)해보는 날이였던 것 같습니다.

    알고리즘 문제를 작성할 때는 생각해 보면 kotlin으로 만 작성하였었지만, 일반적으로 사용했던 것만 사용했던 것 같습니다. 배열,리스트,데이터클래스,큐,스택,함수(재귀) 등등 약간 객체지향 프로그래밍을 그냥 알고 있었다라고 말하기도 창피했던 수준이였던 것 같습니다. 사실 위의 코드 중에 강사님 께서 작성한 코드 스타일로 코드를 제 나름대로 작성 해본 코드가 있는데 작성하는데만 거의 최소 30분 이상 걸렸던 것 같습니다. 지금까지 알고리즘 문제를 풀기만 했지 객체지향 이라는 것을 사용하지도 생각하지도 않았던 까닭인 것 같습니다. 쉬는 날 혹은 지금처럼 회고를 쓸 때 객체지향이라는 느낌에 맞추어 코드를 작성하는 법을 연습해야겠다고 느끼게 되었습니다.

Designed by Tistory.