본문 바로가기

2학년 2학기213

Array, Generic, Collection) Array(2) - 배열 관련 연산 이번에는 배열과 관련된 연산들에 대해서 배워보자.배열 객체 복사배열 원소 추가배열 원소 선택(slice)배열 원소 순환(map)배열 정렬기본적으로 연산관련 메소드는 List를 대상으로 만들어진 것이기 때문에 Array의 연산을 하려면 "메소드Array" 형식으로 진행해야한다.  배열 객체 복사fun main() { val origanlArr = arrayOf(1, 2, 3) val arr1 = origanlArr // 배열 객체 자체를 복사 val arr2 = Array(origanlArr.size) { i -> origanlArr[i] } // 배열의 사이즈와 연산을 사용 val arr3 = origanlArr.clone() // 배열 객체를 복사하는 메서드 사용}  배열.. 2024. 10. 11.
Array, Generic, Collection) Array(1) - 배열의 생성 배열은 순서를 갖고있다. 따라서 정수 인덱싱이 가능하다.배열을 생성하는 방법은 총 3가지가 있다. arrayOf(), Array() + 람다식, 타입 + ArrayOf()   arrayOf()var/val 배열명: Array = arrayOf("", "", "")//타입은 생략가능var/val 배열명 = arrayOf("", "", "")  실제 사용 예시는 아래와 같다.fun main() { val strArr = arrayOf("R", "G", "B") strArr.forEachIndexed{ i, str -> print("strArr[$i] = $str, ")} // strArr[0] = R, strArr[1] = G, strArr[2] = B, }      Array() + 람다식.. 2024. 10. 11.
Class(2) - 범위 함수 범위 함수란?Kotlin에서 객체를 특정 범위(scope) 내에서 처리할 수 있게 도와주는 함수로, 객체의 컨텍스트에서 작업을 수행하는 간결한 방법을 제공한다. 주로 코드의 가독성을 높이고 객체를 효율적으로 처리하기 위해 사용된다.  범위함수에는 let, also, apply, with, run이 있다. let: 지정된 값에 대한 변환 작업을 수행하고, 결과를 반환한다.also: 지정된 값을 그대로 반환하면서, 부수적인 작업(로깅, 디버깅 등)을 수행한다. 주로, 객체를 참조하는 목적으로 사용apply: 객체의 속성을 변경하는 작업을 하고, 객체 자체를 반환한다. 주로, 객체를 참조하는 목적으로 사용with: 특정 객체에 대해 여러 작업을 수행하고, 결과를 반환한다.run: 블록 안에서 객체의 작업을 수.. 2024. 10. 11.
Class(2) - data class data class란?데이터를 저장하고 다루는 용도로 특별하게 설계된 클래스이다. 일반적인 클래스와는 다른 몇가지 자동화된 기능을 제공한다.주로 값 객체를 만들 떄 유용하다.  일반 클래스에도 equals, hashCode메소드가 있는데 뭐가 다른가?일반 클래스는 해당 값들의 주소를 비교한다. 따라서 값이 같아도 주소가 다르면 다르다고 판단한다. 하지만 data 클래스는 값을 비교하기ㄷ 때문에 주소가 달라도 값이 같다면 같다고 판단한다.  data class - toString() data class Fruit(var name: String, var sciName: String, var calories: String)fun main(){ val apple = Fruit("Apple", "학명: Ma.. 2024. 10. 11.
Class(2) - 클래스의 기본 메소드 정의 클래스의 기본 메소드를 재정의할 수 있다. toString, equals, hashCode   1. toString class Person(var name: String, var age: Int)fun main(){ val kim = Person("Kim", 18) println(kim) //Person@1be6f5c3}  원래는 이렇게 객체를 출력하면 객체이름과 이상한 값이 나온다. 이걸 toString() 메소드를 재정의해서 출력해보자.   class Person(var name: String, var age: Int) { override fun toString(): String { return "Person(name='$name', age=$age)" }}fun ma.. 2024. 10. 11.
Class(2) - Object Object란?싱글톤 객체를 정의하거나 익명 객체를 생성하며, 동반 객체를 통해 클래스이 정적 멤버처럼 사용되는 특수한 객체를 만드는 키워드이다. 즉, object를 사용해서 3개의 기능을 얻을 수 있다. 싱글톤, 동반 객체, 무명 객체 이렇게 3개의 기능이 있다.  1. object - singleton클래스는 원래 한개로 여러개의 객체를 만들 수 있다. 하지만 class 키워드 대신에, object를 사용하면 객체가 한개만 만들 수 있다. object Button { var clicked = 0 fun onClick() { clicked++ }} 이렇게 생성할 수 있다. object를 사용할 때는 객체가 하나만 생성이 되기 때문에 따로 객체를 생성하지 않고 사용할 수 있다.. 2024. 10. 11.
익명 함수 람다식은 익명함수의 하나이다. 그러면 익명함수는 뭘까?익명함수란 말 그대로 이름이 없는 함수이다. 즉 함수와 선언 방식이 비슷하다.  기본 구조: 일반 함수에서 함수명만 없애면 익명함수이다.변수명 = fun(변수1: 타입, 변수2: 타입): 반환 타입 = 함수 식   실제로 만들어보자. //[일반적인 함수]fun myPureFunc(a: Int, b: Int): Int{ return a+b}//[람다식]val myLambda:(Int, Int) -> Int = {a: Int, b: Int -> a+b}//[익명 함수]val myAnonymous = fun(a: Int, b: Int): Int = a + b 2024. 10. 11.
확장함수(Extension Funtions) 확장함수기존 클래스에 새로운 기능을 추가하는 방법이다.클래스를 수정하지 않고 새로운 메소드를 정의할 수 있게 해준다.  확장 함수의 기본 문법fun 클래스명.함수명(파라미터들): 반환타입 { // 함수의 본문}    사용 예시fun main(){ println("010-1234-5678".extract { it.isDigit() })}fun String.extract(cond: (Char) -> Boolean): String { val sb = StringBuilder() this.forEach { if (cond(it)) sb.append(it) } return sb.toString()} cond: (Char) -> Boolean은 문자 하나를 받아서 Boolean.. 2024. 10. 11.
람다식(2) - it, _ 사용 람다식의 타입 생략람다식을 선언했을 때 타입을 선언할 수 있는 경우가 있다.  타입을 생략하지 않은 경우val myLambda:(Int, Int) -> Int = {a: Int, b: Int -> a+b} 람다식 자체의 타입을 생략하는 경우 (일반적으로 많이 사용하는 경우)val myLambda = {a: Int, b: Int -> a+b} 람다식 내부 입력 변수 타입을 생략하는 경우val myLambda:(Int, Int) -> Int = {a, b -> a+b}    일반적인 함수와 람다식 사용의 차이 //일반적인 함수fun myFun(i: Int): Int = i * 10fun main() { val times = ::myFun println(times(2)) //20} //람다식fun .. 2024. 10. 10.
람다식(1) - 기본적인 선언과 호출, 고차함수와의 사용 람다식이란?람다식이란, 이름이 없는 함수를 간결하게 표현하는 방식이다. 기본 구조변수명: 입력 타입 -> 반환 타입 = {매개변수 -> 함수본문}  적당한 예시로 더하는 일반적인 함수를 람다식으로 변경해보자.//[일반적인 함수]fun myPureFunc(a: Int, b: Int): Int{ return a+b}//[람다식]val myLambda:(Int, Int) -> Int = {a: Int, b: Int -> a+b}// 타입 생략 가능val myLambda:(Int, Int) -> Int = {a, b -> a+b} 이렇게 일반적인 함수를 간단하게 함수이름 없이 람다식으로 간단하게 표현할 수 있다. 람다식의 호출 람다식을 직접 활용해서 호출하는 방법fun main() { val myLa.. 2024. 10. 10.
고차함수(2) - 응용편 고차 함수란 일급 함수라고 했다. 즉, 변수가 함수 역할을 할 수 있다. 일급 함수라는 점을 이용해서, 변수에 함수를 참조해서 변수를 통해서 해당 함수를 사용해보자. 일급 함수를 이용한 고차함수의 활용경우 - 1val strToLower: (String) -> String = String::lowercase//String 클래스의 lowercase 메소드를 사용해서 해당 메소드이 인자로 String을 전달하고 결과를 String으로 받아오는 변수val s: String = "My Lovely Baby"println(strToLower(s)) //my lovely baby 이렇게 변수가 함수 역할을 할 수 있다는 점을 이용해서 String 클래스의 lowercase 메소드를 참조하여 해당 변수를 이용해서 .. 2024. 10. 10.
고차함수(1) - 선언과 사용 고차함수란?일급 함수이면서 일급객체를 사용할 수 있는 것이다. 일급 함수란 함수가 변수 역할을 하는 것이고, 일급 객체란 함수의 실 인자로 사용할 수 있으며, 함수의 반환 값으로도 사용할 수 있는 것이다.   일반 함수와 고차함수의 차이// 일반 함수fun multiply(a: Int, b: Int): Int { return a * b} 일반 함수는 위와 같이 변수만 인자로 받아서 그 변수들을 통해 연산을 해서 값을 반환한다.  fun multiply(a: Int, b: Int, hfunc:(Int, Int) -> Int): Int { return hfunc(a, b)} 하지만 고차함수는 함수를 인자로 받을 수 있다. 즉, 인자로 전달 받은 함수와 전달 받은 변수의 값들을 이용해서 값을 반환한.. 2024. 10. 10.
Kotiln - 함수 함수의 기본 형태fun 함수이름(매개변수: 매개변수 타입) : 반환 타입 { //함수 동작}   Top-level function과 member functionclass Shape { fun calculateArea_method(w: Int, h: Int, ): Int { // member function = method return w * h }}fun calculateArea_top_level(w: Int, h: Int, ): Int { // top-level function return w * h}  Top-level function: 클래스 밖에 생성된 함수Member function: 클래스에 속한 함수 가변 인자: 인자의 개수가 달라질 수 있다. fun acc.. 2024. 10. 10.
개인_실습(DataFrame) 2024. 10. 10.
데이터 프레임 특정 열 삭제 하는 방법 df = df.drop('열 이름', axis=1) 2024. 10. 10.
[pandas] Missing value 다루기 Missing value란?: 다양한 원인으로 있는줄 알았지만 없는 데이터. 즉, NaN 또는 None Missing value 관련 내장 메소드  Missing value 탐지 Missing value가 존재하는지 - isnull()Missing value 가 없는지 - notnull()Missing value 삭제 Missing value가 있는 행을 삭제 - dropna() Missing value가 있는 열을 삭제 - dropna(aixs = 'columns') 행 또는 열이 모두 Missing value일 때, 삭제 - dropna(aixs = 'columns', how = 'all')행 또는 열의 Missing value 개수가 n개 미만일 때, 삭제 - dropna(aixs = 'column.. 2024. 10. 10.
데이터 프레임 인덱싱하는 방법 행과 열에 있는 데이터 접근데이터 프레임 명.loc[행 이름, 열 이름]조건에 해당하는 행의 데이터에 접근데이터 프레임 명.loc[조건] 조건에 해당하는 행의 데이터애서 특정한 열에 접근데이터 프레임 명.loc[조건, 열의 이름] 2024. 10. 10.
Week6 - 실습 문제 풀이) 랜덤 정수 값을 이용해서 데이터를 만들어야하기 때문에, 행의 이름들과 열의 이름들을 따로 만들어주고 데이터 프레임을 제작해야했다.따라서 반복문을 이용해서 rows, cols의 리스트를 생성하고, 아래의 생성 방식으로 데이터 프레임을 생성하였다. df = pd.DataFrame(데이터 프레임의 데이터, index = '행의 이름들', columns = '열의 이름들')    문제 풀이)  axis = 1은 열끼리의 연산을 진행하는 것이다. 즉, C1, C2 ... C10까지의 연산이다. 따라서 각 행의 열들의 값의 평균을 구하고 'mean'이름의 열에 평균들을 추가했다.     우선 pass 컬럼을 만들고 모두 Y로 초기화주었다.그리고 이중 반복문을 이용해서 각 행을 인덱싱하고, 해당 행의 각.. 2024. 10. 10.
4.7 Arithmetic logic shift unit S들의 값에 따라서 산술 연산 부터 로직 연산까지 사용할 수 있는 회로이다. 2024. 10. 9.
4.6 shift micro-operations shift micro-operations   오버플로우Shift는 곱하기 2 또는 나누기의 효과를 가져온다. 따라서 쉬프트를 하면 부호는 변경되지 않는다. 따라서 Logical Shift, Circular Shift를 했을 때, 최 상위 비트인 부호비트는 변경되면 안된다.  따라서, Shift를 하기 전에, 최상위 비트와 이전 비트의 값이 다르다면 오버플로우가 발생한 것으로 간주한다! 2024. 10. 9.
4.5 Logic micro-operations 논리 마이크로 연산은 비트간의 연산이다. 예를 들어 R1 = 1 0 1 0, R2 = 1 1 0 0일 때, P: R1 P가 1일 때 R1은 0 1 1 0이다.    16 different binary logic operations   Hardware implementation: S1, S2 총 2개의 Input의 조합으로 AND, OR, XOR, NOT 연산을 선택할 수 있다.   Logic micro-operations의 응용 2024. 10. 9.
4.4 Arithmetic micro-operations(산술 마이크로 - 연산) 우리가 앞서 했던 레지스터간의 데이터 전달도 마이크로 연산이다. 데이터 전달 이외의 Arithmetic, Logic, Shift 마이크로 연산이 있다. 이번 장에서는 산술 마이크로 연산에 대해서 알아보자.     ADDSUBTRACT M = 0일 때, B(i) ⊕ 0 = B(i)이기 때문에 위에 있는 ADD의 회로와 같은 역할을한다.M = 1일 때, B(i) ⊕ 1 = B(i)'이기 때문에  A(i) + B(i)' + C0이다. 즉, A(i) + B(i)의 1의 보수 + 1 ==  A(i) + B(i)의 2의 보수이다.따라서 M = 1일 때는 A(i) - B(i)이다.  INCREMENT  Total Arithmetic Circuit  Decrement A에서 Y의 값은 1인데, 왜 Out은 A -1 일.. 2024. 10. 9.
4.3 Bus and memory transfer BusBus라는 것은 공통 라인의 set이라고 보면된다. 즉, 여러 장치를 공유하는 통로라고 생각하면된다. Bus는 복수개의 레지스터의 데이터 전송을 효율적으로 나타내기 위해서 사용한다. 예를 들어, 컴퓨터 안에서 CPU, RAM 등 다른 장치들이 서로 데이터를 주고받을 떄, 각각의 장치가 따로따로 연결되어 있으면 매우 복잡해진다. 그래서 여러 장치들을 하나의 Bus를 사용해서 데이터를 주고 받는다. 이렇게 Bus는 일종의 공유하는 도로 같은 역할을 하며, 이 도로를 통해서 다양한 장치들이 데이터를 동시에 주고 받을 수 있다.   Bus의 회로도(Mux)   S1 S0MUX 0(f)MUX 1(f)MUX 2(f)MUX 3(f)Register10 0A0A1A2A3A20 1B0B1B2B3B31 0C0C1C2C.. 2024. 10. 9.
4.2 Register transfer Clock pulse가 상승이고, Load가 1일 때 R1에서 R2로 데이터를 전달한다. (병렬 연결로 구현가능)   위의 상황을 Register transfer language로 작성하면 아래와 같다.  Register transfer language에 대해서 자세하게 살펴보자. Register transfer language Register에 대한 표현알파벳과 숫자의 조합으로 나타낼 수 있다.예) MAR, R2, R1레지스터의 파트(비트 수, 상위 & 하위 비트)에 대한 표현비트 수의 예시 - R2(0-7)상위 비트 예시 - R2(H)하위 비트 예시 - R2(L)데이터의 전송에 대한 표현➡️⬅️동시에 일어나는 연산에 대한 표현, 2024. 10. 9.
4.1 Register transfer language 컴퓨터 구조에서 레지스터 전송은 매우 중요한 개념이다. 레지스터는 데이터를 일시적으로 저장하는 고속의 작은 메모리이며, CPU의 작업 처리 과정에서 필수적인 역할을 한다. 레지스터 간의 데이터 이동을 효율적으로 표현하는 것은 시스템의 성능을 최적화하는 데 중요한 요소이다.레지스터 전송을 효과적으로 표현하는 방법에는 마이크로 연산(Micro-Operation)이 사용된다. 마이크로 연산은 레지스터 간의 데이터 이동, 연산, 메모리 접근 등의 기본 작업 단위를 의미하며, 이는 CPU가 실행하는 명령어를 더 세부적으로 나누어 처리할 수 있도록 돕는다. 이와 같은 내용은 컴퓨터의 동작 원리와 밀접하게 연결되어 있으며, 5장에서 배울 컴퓨터 구조를 이해하는 데 중요한 기초 개념이다. 4장에서는 이러한 레지스터 전.. 2024. 10. 9.