[Android/Flutter 교육] 5일차

MSU·2024년 1월 2일

Android-Flutter

목록 보기
5/85
post-thumbnail

format

자바에서는 printf로 %05d 등을 활용했는데
코틀린에서는 printf가 없어서 printf대신 .format()을 활용함

format : 출력 서식을 이용하여 문자열을 만들 수 있다.
정수 : %d, 실수 : %f, 문자열 : %s, 문자 : %c
%숫자d, %숫자s : 숫자만큼 자리를 확보한 다음 우측 정렬로 출력한다. 비어있는 공간은 공백으로 채워준다.
%.숫자f : 소수점 이하의 값을 숫자만큼만 표시한다.
%0숫자d : 숫자 만큼 자리를 확보한 다음 우측 정렬로 출력한다. 비어있는 공간은 0으로 채워준다.

val a1 = "%2d일차 : %8s%8s%8d원".format(1, "","", 100)
println(a1)
 1일차 :                      100원

안드로이드에서는 콘솔기반프로그래밍이 아니기때문에 안씀

break / continue / return

break : 가장 가까운 반복문의 수행을 중단시킨다.

continue : 다음 반복으로 넘어간다.

fun main() {

    // break
    for(v1 in 1..10){
        if(v1 > 5){
            break
        }
        println("v1 : $v1")
    }

    println()

    //continue
    for(v2 in 1..10){
        if(v2 % 2 == 0){
            continue
        }
        println("v2 : $v2")
    }
}
v1 : 1
v1 : 2
v1 : 3
v1 : 4
v1 : 5

v2 : 1
v2 : 3
v2 : 5
v2 : 7
v2 : 9

객체 지향 프로그래밍(OOP, Object Oriented Programming)

  • 프로그램이 가져야 하는 다양한 기능들이나 변수들을 객체라는 단위로 나눠서 관리하는 기법
  • 객체지향 프로그래밍 기법에서는 객체를 만들기 위한 클래스를 설계하고 클래스를 통해 필요한 만큼의 객체를 생성한다
  • 각 객체들은 서로 독립적인 존재이며 하나의 객체에는 그 객체가 가져야할 모든 변수(멤버 변수)와 모든 함수(메서드)를 가지고 있어야 한다.

1970년대 초 os를 만들기 위해 -> C언어 탄생
C언어는 절차지향적 언어(코드가 위에서 아래로 흘러감)

관점지향, ~지향 모두 기존의 객체지향에서 조금 더 붙여 쉽고 편하게 사용할 수 있도록 확장한 개념임

객체지향의 3가지 방식

  • simula(처음 쓰인 방식) : simula6, 초기 IT기술은 군사기술에서 출발하여 발전해옴
    미 공군 파일럿을 훈련시키기 위한 소프트웨어를 simula6방식으로 개발
  • small talk(오늘날 많이 쓰임)
  • classical

객체지향의 목적

  • 안전하고 간결한 코드 작성

클래스

클래스 다이어그램 : 클래스가 어떤 구조인지 표현

// 클래스를 정의한다.
// class 클래스이름
class TestClass1{

}

// 코틀린에서는 클래스 내부에 코드가 없다면 { } 생략이 가능하다.
class TestClass2

fun main() {
    // 객체를 생성한다.
    // 객체가 생성되면 생성된 객체는 메모리에 자리를 잡는다.
    // 생성된 객체를 출력하면
    // 클래스이름@객체의일련번호 형태로 출력된다.
    println(TestClass1())
    // 객체가 생성되면 객체를 구분하기 위한 일련번호(흔히 객체의 주소값이라고 부른다)
    // 이 객체의 주소값은 모든 객체에게 다르게 부여된다.
    // 객체는 객체의 주소값을 가지고 객체를 구분하고 지칭할 수 있다.
    // 객체를 생성하게 되면 이 객체의 주소값이 반환되고 이를 변수에 담아 두었다가
    // 객체를 사용하고자 할 때 객체의 주소값을 가지고 있는 변수를 통해 객체에 접근할 수 있다.
    val obj1:TestClass1 = TestClass1()
    println("obj1 : $obj1")

    val obj2 = TestClass2()
}
TestClass1@6af10854
obj1 : TestClass1@7643f2ba
obj2 : TestClass2@31dc3367
  • 객체가 가지는 변수를 맴버 변수라고 부른다.
  • 객체가 가지는 함수를 맴버 메서드라고 부른다.
class TestClass3{

    // 멤버 변수
    var a1 = 0
    var a2 = 0

    // 멤버 메서드
    fun testMethod1(){
        println("testMethod1")
    }
    fun testMethod2(){
        println("testMethod2")
    }
}

fun main() {
	val obj3 = TestClass3()
    // 객체가 가지고 있는 멤버 변수나 멤버 메서드를 사용하려면
    // . 연산자를 사용한다.
    obj3.a1 = 100
    obj3.a2 = 200
    println("obj3.a1 : ${obj3.a1}")
    println("obj3.a2 : ${obj3.a2}")

    obj3.testMethod1()
    obj3.testMethod2()
    
}
obj3.a1 : 100
obj3.a2 : 200
testMethod1
testMethod2

객체지향 프로그래밍 절차

절차지향 프로그래밍에서 객체지향 프로그래밍은 아래와 같이 바뀐다.

  • step1) 출력 화면을 구현한다.
    출력화면 구현시 필요한 데이터는 임의의 데이터로 설정해준다.

  • step2) 프로그램에서 필요한 기능들을 정리한다.

  • step3) step3에서 정리한 기능들을 그룹으로 묶어 준다.

  • step4) 출력 화면과 step2, step3에서 정의한 기능을 보고 필요한 데이터를 정리한다.
    필요할 데이터 : 화면을 구성하기 위해 필요한 데이터, 입력받는 데이터, 발생되는 데이터, 계산되는 데이터 등등

  • step5) step4에서 정리한 변수들을 그룹으로 묶어 준다.

  • step6) 클래스를 정의한다.
    클래스 내부에 변수를 작성해주고 메서드를 작성해준다.
    메서드의 코드는 아직 작성하지 않는다.

  • step7) 메서드 내부의 코드를 작성하고 이를 테스트 한다.

  • step8) main에서 필요한 만큼 객체를 생성하고 메서드를 호출하여 프로그램을 완성한다.

  • 주의!!! main에서는 절대로 객체가 관리하는 변수에 직접 접근하지 마세요



문제 - 학생 관리 프로그램 만들기

  • 요구사항
    1. 학생들의 이름, 국어, 영어, 수학점수를 관리하는 프로그램을 작성한다.
    2. 학생의 정보는 모두 입력을 받는다.
    3. 입력이 완료된 후에 각 학생별 정보를 출력하고
    4. 각 과목별 총점과 평균을 출력한다.

step1

출력 화면을 구현한다.
출력화면 구현시 필요한 데이터는 임의의 데이터로 설정해준다.

// 출력 화면 - 테스트용으로 나중에 지우기
fun printResult(){
    println("이름 : 홍길동")
    println("국어 : 100점")
    println("영어 : 90점")
    println("수학 : 80점")
    println()
    println("이름 : 홍길동")
    println("국어 : 100점")
    println("영어 : 90점")
    println("수학 : 80점")
    println()
    println("이름 : 홍길동")
    println("국어 : 100점")
    println("영어 : 90점")
    println("수학 : 80점")
    println()

    println("국어 총점 : 300점")
    println("영어 총점 : 270점")
    println("수학 총점 : 240점")
    println("국어 평균 : 100점")
    println("영어 평균 : 90점")
    println("수학 평균 : 80점")
}

printResult()

step2

프로그램에서 필요한 기능들을 정리한다.
1. 학생의 이름을 입력받는 기능
2. 점수를 입력받는 기능
3. 평균을 구하는 기능
4. 총점을 계산하는 기능
5. 출력하는 기능

step3

step2에서 정리한 기능들을 그룹으로 묶어준다.
1. 학생의 정보를 입력받는 기능 -> 학생
2. 평균을 구하는 기능 -> 학생들
3. 총점을 계산하는 기능 -> 학생들
4. 각 학생의 정보를 출력하는 기능 -> 학생
5. 학생들의 과목별 총점과 평균을 구하는 기능 -> 학생들

step4

출력 화면과 step2, step3에서 정의한 기능을 보고 필요한 데이터를 정리한다.
필요할 데이터 : 화면을 구성하기 위해 필요한 데이터, 입력받는 데이터, 발생되는 데이터, 계산되는 데이터 등등

  • 학생의 이름
  • 학생의 국어 점수
  • 학생의 영어 점수
  • 학생의 수학 점수
  • 국어 총점
  • 영어 총점
  • 수학 총점
  • 국어 평균
  • 영어 평균
  • 수학 평균

step5

step4에서 정리한 변수들을 그룹으로 묶어 준다.

  • 학생의 이름 -> 학생
  • 학생의 국어 점수 -> 학생
  • 학생의 영어 점수 -> 학생
  • 학생의 수학 점수 -> 학생
  • 국어 총점 -> 학생들
  • 영어 총점 -> 학생들
  • 수학 총점 -> 학생들
  • 국어 평균 -> 학생들
  • 영어 평균 -> 학생들
  • 수학 평균 -> 학생들

step6

클래스를 정의한다.
클래스 내부에 변수를 작성해주고 메서드를 작성해준다.
메서드의 코드는 아직 작성하지 않는다.

// 학생 클래스
class StudentClass{
    var name = ""
    var kor = 0
    var eng = 0
    var math = 0
}



// 학생들을 관리하는 클래스
class StudentManagerClass{
    var korTotal = 0
    var engTotal = 0
    var mathTotal = 0
    var korAvg = 0
    var engAvg = 0
    var mathAvg = 0

    // 학생 객체의 주소값을 담을 변수, 나중에 매개변수로 학생 객체를 받는 방법 공부할 예정
    var s1 = StudentClass()
    var s2 = StudentClass()
    var s3 = StudentClass()
}

step7

메서드 내부의 코드를 작성하고 이를 테스트한다.

// 학생 클래스
class StudentClass{
    var name = ""
    var kor = 0
    var eng = 0
    var math = 0

    // 학생의 정보를 입력받는 메서드
    fun inputStudentInfo(scanner:Scanner){
        print("이름 : ")
        name = scanner.next()
        print("국어 : ")
        kor = scanner.nextInt()
        print("영어 : ")
        eng = scanner.nextInt()
        print("수학 : ")
        math = scanner.nextInt()
    }

    // 학생의 정보를 출력하는 메서드
    fun printStudentInfo(){
        println("이름 : $name")
        println("국어 점수 : $kor")
        println("영어 점수 : $eng")
        println("수학 점수 : $math")
        println()
    }
}

// 학생들을 관리하는 클래스
class StudentManagerClass{
    var korTotal = 0
    var engTotal = 0
    var mathTotal = 0
    var korAvg = 0
    var engAvg = 0
    var mathAvg = 0
    // 학생 객체의 주소값을 담을 변수
    var s1 = StudentClass()
    var s2 = StudentClass()
    var s3 = StudentClass()

    // 각 학생들의 정보를 입력받기 위한 메서드
    fun inputStudentInfo(){
        val scanner = Scanner(System.`in`)
        s1.inputStudentInfo(scanner)
        s2.inputStudentInfo(scanner)
        s3.inputStudentInfo(scanner)
    }

    // 각 학생들의 정보를 출력하는 메서드
    fun printStudentInfo(){
        s1.printStudentInfo()
        s2.printStudentInfo()
        s3.printStudentInfo()
    }

    // 과목별 평균을 구하는 메서드
    fun getAvg(){
        korAvg = (s1.kor + s2.kor + s3.kor) / 3
        engAvg = (s1.eng + s2.eng + s3.eng) / 3
        mathAvg = (s1.math + s2.math + s3.math) / 3
    }

    // 과목별 총점을 구하는 메서드
    fun getTotal(){
        korTotal = s1.kor + s2.kor + s3.kor
        engTotal = s1.eng + s2.eng + s3.eng
        mathTotal = s1.math + s2.math + s3.math
    }

    // 과목별 총점과 평균을 출력하는 메서드
    fun printResult(){
        println("국어 총점 : $korTotal")
        println("영어 총점 : $engTotal")
        println("수학 총점 : $mathTotal")
        println("국어 평균 : $korAvg")
        println("영어 평균 : $engAvg")
        println("수학 평균 : $mathAvg")
    }
}


fun main() {
    // Student 클래스의 inputStudentInfo 테스트
    val scanner = Scanner(System.`in`)
    val s1 = StudentClass()
    s1.inputStudentInfo(scanner)

    println(s1.name)
    println(s1.kor)
    println(s1.eng)
    println(s1.math)

    // Student 클래스의 printStudentInfo 테스트
    val s1 = StudentClass()
    s1.name = "홍길동"
    s1.kor = 100
    s1.eng = 90
    s1.math = 80
    s1.printStudentInfo()

    // StudentManagerClass의 getAvg 메서드 테스트
    val manager1 = StudentManagerClass()
    manager1.getAvg()
    println(manager1.korAvg)
    println(manager1.engAvg)
    println(manager1.mathAvg)

    // StudentManagerClass의 getTotal 메서드 테스트
    val manager1 = StudentManagerClass()
    manager1.getTotal()
    println(manager1.korTotal)
    println(manager1.engTotal)
    println(manager1.mathTotal)

    // StudentManagerClass의 printResult 메서드 테스트
    val manager1 = StudentManagerClass()
    manager1.printResult()
}

step8

main에서 필요한 만큼 객체를 생성하고 메서드를 호출하여 프로그램을 완성한다.

fun main() {
    // 학생 관리 요소의 객체를 생성한다.
    val studentManagerClass = StudentManagerClass()
    // 학생 정보를 입력받는다.
    studentManagerClass.inputStudentInfo()
    // 각 과목별 총점을 구한다.
    studentManagerClass.getTotal()
    // 각 과목별 평균을 구한다.
    studentManagerClass.getAvg()
    // 각 학생별 정보를 출력한다.
    studentManagerClass.printResult()
}
// 입력
이름 : 학생1
국어 : 10
영어 : 20
수학 : 30

이름 : 학생2
국어 : 20
영어 : 30
수학 : 40

이름 : 학생3
국어 : 30
영어 : 40
수학 : 50

// 출력
국어 총점 : 60
영어 총점 : 90
수학 총점 : 120
국어 평균 : 20
영어 평균 : 30
수학 평균 : 40



※ 출처 : 멋쟁이사자 앱스쿨 2기, 소프트캠퍼스
profile
안드로이드공부

0개의 댓글