본문 바로가기

분류 전체보기564

Class(1) - 추상 클래스와 인터페이스 추상 클래스(abstract): 추상 클래스는 일부 기능을 미리 구현(abstract 키워드 필요!)할 수 있으며, 나머지 기능은 추상 메소드로 남겨놓아 상속받는 클래스에서 구현하도록 요구할 수 있다. : 완전한 구현과 추상적인 정의를 모두 가질 수 있다. :상속을 통해 기능을 재사용하고, 공통된 동작을 하위 클래스에 제공할 때 유용 // 추상 클래스abstract class Bar { abstract fun foo() // 기능 구현 불가능! 하위 클래스에서 구현해야함 fun bar(){ // 일반 메서드 println("Bar!!!") }}// 상속 받을 떄 () 필수 !!!!!!class Foo : Bar() { override fun foo() { .. 2024. 10. 1.
Class(1) - 상속 상속 (Inheritance)상속에는 클래스 상속과 인터페이스 상속이 있는데 우선 클래스 상속에 대해서만 알아보자. 클래스 상속은 단일 상속이므로 한 부모에게만 상속 받을 수 있다. 부모클래스 명칭super classbase classparent class 자식 클래스 명칭sub class derived classchild calss  부모 클래스를 선언하고 자식 클래스에 상속 하는 과정: 상속이 가능하게 하려면 부모 클래스가 될 클래스 앞에 open이라는 키워드를 작성해주어야한다.   [상속하기 전 3개의 클래스 선언] class Animal { var color: String = "" fun eat(){ println("냠냠") }}class Dog { var col.. 2024. 10. 1.
Class(1) - getter, setter 속성 (getter, setter)값을 읽어오는 것을 getter, 값을 설정해주는 것을 setter라고 한다. 기본적으로 코틀린에서는 프로퍼티를 생성하면 val, var에 따라서 자동으로 getter 또는 setter를 작성해준다. (직접 정의할 수도 있다.) val getter만 생성된다. -> val은 값을 할당할 수 없기 떄문이다.vargetter, setter 모두 생성된다.    getter 정의해보기 class Person() { val name: String = "Kim" get(){ //get() = field로 생략 가능 return field } var age: Int = 24 get(){ //get() = fiel.. 2024. 10. 1.
Class(1) - 클래스 선언과 생성자 클래스 및 객체 // 클랙스 선언 - 캡슐화class Person { // 프로퍼티 val name: String = "Kim" var age: Int = 24 var isMarried: Boolean = false //메서드 fun getName() = println("Your name is ${this.name}")}fun main() { val p = Person() //기본 생성자 호출 //dot-notation println(p.name) //Kim} 이렇게 클래스를 선언하고 main함수에서 클래스의 객체를 선언해서 해당 클래스에 있는 요소들에 접근할 수 있다.   하지만 클래스를 사용하는 이유는 커스텀 타입을 만들기 위해서이다. 즉, 여러 데이터.. 2024. 9. 30.
고급 프로그래밍 기법(1) - 제너릭, Attribute 1. 제네릭(Generic)제네릭 프로그래밍은 클래스나 메소드에서 특정 데이터형에 의존하지 않고, 다양한 자료형을 처리할 수 있도록 프로그래밍하는 기법입니다. 이를 통해 코드 재사용성을 높이고, 자료형에 따른 중복 코드를 줄일 수 있습니다.제네릭의 주요 특징:타입 매개변수: 제네릭 클래스나 메소드에서 사용할 자료형을 미리 정해놓지 않고, 필요한 시점에 구체적인 자료형을 지정할 수 있습니다. 타입 매개변수는 형태로 사용됩니다.장점: 다양한 자료형을 처리할 수 있어 재사용성이 높아지고, 자료형에 따른 중복 코드를 줄일 수 있습니다. 제네릭 클래스 예시:class SimpleGeneric { private T[] values; private int index; public SimpleGene.. 2024. 9. 30.
인터페이스(2) - 인터페이스, 다중상속 1. 인터페이스(Interface)란 무엇인가?인터페이스는 구현되지 않은 메소드, 프로퍼티, 인덱서, 이벤트로 구성된 설계의 표현입니다. 인터페이스는 구체적인 구현 없이 메소드 시그니처만 정의하며, 이 인터페이스를 구현하는 클래스가 그 메소드들을 구체적으로 구현해야 합니다.주요 특징:interface 키워드를 사용하여 선언.다중 상속이 가능함.모든 멤버는 public으로 접근 가능.인터페이스는 객체 자체를 가질 수 없으며, 구현되지 않은 기능만을 정의.인터페이스 선언 예시:interface IShape { void Draw(); double Area();}   2. 인터페이스의 구현인터페이스는 클래스를 통해 구현되며, 인터페이스에 정의된 모든 멤버를 구현해야 합니다. 만약 하나라도 구현하지 않.. 2024. 9. 30.
인터페이스(1) - 파생 클래스, 메소드 오버라이딩, 추상 클래스 1. 파생 클래스 (Derived Class)상속(Inheritance): 상속은 베이스 클래스의 모든 멤버를 파생 클래스로 전달하여, 코드의 재사용성을 높이는 기능입니다. C#에서는 단일 상속만 지원하며, 하나의 베이스 클래스로부터만 상속할 수 있습니다.파생 클래스의 정의 예시:class BaseClass { int a; void MethodA() { // ... }}class DerivedClass : BaseClass { int b; void MethodB() { // ... }}base 지정어: 베이스 클래스의 생성자나 메소드를 호출할 때 base 키워드를 사용합니다.만약 상속받은 클래스의 값을 사용하고 싶다면 base.a 이런식으로 사용하.. 2024. 9. 30.
클래스(2) - 메소드 / 연산자 오버로딩, 생성자, 인덱서, 프로퍼티 1. 메소드 중복 (Method Overloading) 메소드 시그니처(Signature): 메소드를 구분하는 정보로 메소드 이름, 매개변수 개수, 매개변수 자료형을 포함합니다. 반환형은 시그니처에 포함되지 않습니다.메소드 중복: 같은 이름의 메소드를 여러 개 정의할 수 있으며, 매개변수의 개수나 자료형이 다르면 다른 메소드로 취급됩니다. 이를 통해 같은 이름의 메소드를 다양하게 활용할 수 있습니다. 예시 코드:class MethodOverloadingApp { void SomeThing() { Console.WriteLine("SomeThing() is called."); } void SomeThing(int i) { Console.WriteLine("SomeT.. 2024. 9. 30.
클래스(1) - 클래스 선언, 생성, 필드, 메소드 1. 클래스 선언 및 객체 생성클래스는 프로그램의 기본 단위로, 필드와 메소드 등을 포함할 수 있습니다. 아래는 Fraction 클래스에 대한 예시입니다.using System;class Fraction { int numerator; // 분자 int denominator; // 분모 // 생성자 public Fraction(int numerator, int denominator) { this.numerator = numerator; this.denominator = denominator; } // 덧셈 메소드 public Fraction Add(Fraction f) { int newNumerator = this.numerat.. 2024. 9. 30.
필드와 프로퍼티의 차이 필드(Field)와 프로퍼티(Property)는 C# 클래스에서 객체의 상태를 저장하고 데이터에 접근하는 방법을 제공합니다. 두 개념은 서로 관련이 있지만, 사용 방법과 목적이 다릅니다.1. 필드(Field)필드는 클래스나 구조체 내부에 선언된 변수로, 객체의 상태를 직접적으로 저장하는 공간입니다.필드는 주로 private으로 선언되어 직접 접근을 제한하며, 클래스 내부에서만 접근 가능합니다.예시:class Car { // 필드 선언 private string model; private int year;}특징:필드는 클래스 내부의 변수로, 값을 직접 저장하고 관리합니다.보통 접근 제어자(private)를 사용하여 외부에서 필드에 직접 접근하지 못하게 보호합니다.필드를 직접적으로 외부에 노.. 2024. 9. 30.
표준 입출력 표준 입출력문 (Standard Input/Output)  입력: Console.Read(), Console.ReadLine()을 사용해 입력을 받을 수 있습니다. string name = Console.ReadLine(); // 사용자로부터 입력 받음  출력: Console.Write(), Console.WriteLine()을 사용해 출력할 수 있습니다.Console.WriteLine("Hello, World!"); // 화면에 출력// 형식 지정자를 사용한 출력double pi = 3.14159265358979;Console.WriteLine("Pi: {0:F2}", pi); // 소수점 둘째 자리까지 출력 2024. 9. 30.
오버 플로우 검사문 (Checked) 오버플로 검사문 (Overflow Checking)checked 문: 오버플로를 명시적으로 검사checked { int result = int.MaxValue + 1; // 오버플로가 발생하여 예외 발생}  unchecked 문: 오버플로를 검사하지 않음unchecked { int result = int.MaxValue + 1; // 오버플로가 발생해도 예외 발생하지 않음 // result: -2147483648} 2024. 9. 30.
Break와 Continue break 문: 루프나 switch 문을 종료 for (int i = 0; i   continue 문: 다음 반복을 시작 for (int i = 0; i 2024. 9. 30.
Nullable Type 널이 가능한 형(Nullable Type)은 값 형식(Value Type)에 null 값을 허용할 수 있도록 하는 C#의 기능입니다. 기본적으로 값 형식(int, float, bool 등)은 null 값을 가질 수 없습니다. 하지만 널이 가능한 형을 사용하면 값이 없음을 나타내는 null을 할당할 수 있습니다.  1. 널이 가능한 형의 정의널이 가능한 형은 기본 값 형식 뒤에 ? 기호를 붙여 정의할 수 있습니다. 이렇게 정의된 변수는 값이 없음을 의미하는 null 값을 가질 수 있습니다.예시: int?, float?, bool? 등이 널이 가능한 형입니다.int? age = null; // 널이 가능한 int 형double? temperature = 36.5; // 값이 존재하는 경우   2. 널이 .. 2024. 9. 30.
형변환(캐스팅) 형 변환(Type Conversion)은 한 자료형의 값을 다른 자료형으로 변환하는 것을 의미합니다. C#에서 형 변환은 묵시적 형 변환(Implicit Conversion)과 명시적 형 변환(Explicit Conversion)으로 나뉩니다.1. 묵시적 형 변환 (Implicit Conversion)묵시적 형 변환은 컴파일러가 자동으로 수행하는 형 변환입니다. 주로 데이터 손실이 없는 변환, 즉 작은 크기의 자료형에서 큰 크기의 자료형으로 변환할 때 발생합니다.예시: int에서 double로 변환int myInt = 10;double myDouble = myInt; // 자동으로 형 변환Console.WriteLine(myDouble); // 출력: 10.0   2. 명시적 형 변환 (Explici.. 2024. 9. 30.
2.7 Memory units 읽기 쓰기 모두 가능한 메모리 - RAM  읽기를 진행할 때1. 메모리의 주소 전달2. Read Signal 전달3. 해당 주소에 있는 데이터를 Output으로 받는다.   쓰기를 진행할 때1. 메모리의 주소 전달2. Write Signal 전달3. 쓰고 싶은 데이터 전달4. 해당 주소에 있는 데이터를 Output으로 받는다.   읽기만 가능한 메모리 - ROM  1. 읽고 싶은 데이터의 주소 전달2. 해당 주소에 있는 데이터를 Output으로 받는다. 2024. 9. 29.
2.6 Binary Counters(2) - Binary counter with parallel load Binary counter with parallel load: Clear, Load, Increment(Count)의 값에 따라 서로 다른 연산을 하는 회로         1. Function 구하기 2. funtion table 작성하기 각각 Clear, Load, Increment에 대해 각 값들의 변화에 따라서 어떤 연산을 하는지 살펴보자. ClearClear가 1일 때 Load, Increment의 값과 상관 없이 J = 0 + 0 = 0, K = 1 + 0 + 0 = 1으로 J = 0, K = 1이 된다.따라서 Clear가 1일 때 J = 0, K = 1 이기 때문에 출력값은 모두 0으로 바뀐다. Clear가 0일 때는 Load, Increment의 값에 영향을 받는다. 따라서 우선 Load =.. 2024. 9. 29.
2.6 Binary Counters(1) - 4-bit synchronous binary counter 💡 Counter란 무엇인가?  카운터도 레지스터이다. 이진 값을 저장한다는 것에서 같은 레지스터이지만 카운터는 정해진 상태를 반복하게 되는(Sequence) 레지스터이다.    4-bit synchronous binary counter: 0부터 15까지의 이진수를 클럭 신호에 맞춰 차례로 셀 수 있는 회로   위의 회로를 분석해보자.  분석 순서는 'Function 찾기 -> State table 작성하기 -> State Diagram 작성하기' 이다.  1. Function 찾기 J(0) = K(0) = X J(1) = K(1) = X * A(0) J(2) = K(2) = X * A(0) * A(1) J(3) = K(3) = X * A(0) * A(1) * A(2) Y = X * A(0) * A(1.. 2024. 9. 29.
cs231n - lecture06(Trainit NN Part 2) ⭐️⭐️⭐️ NN(신경망)을 Training하는 프로세스 ⭐️⭐️⭐️   1. 데이터의 미니배치를 샘플링전체 데이터 셋에서 미니배치를 샘플링(무작위로 선택)하여 학습에 사용한다. 이는 계산 효율성을 높이고, 매 스텝마다 모델이 다른 데이터에 대해 학습할 수 있도록 한다.  2. Forward pass입력 데이터를 신경망에 통과시켜 출력 값을 얻고, 그 출력 값과 실제 라벨 간의 차이(손실, Loss)를 계산한다. 이를 통해 모델의 예측 성능을 평가한다.  3. Backward pass (역전파)출력층부터 시작해서 각 층의 노드(뉴런)들이 손실에 얼마나 기여했는지를 계산한다. 이를 위해 chain rule(연쇄 법칙)을 사용하여, 출력층에서 손실에 대한 기울기를 먼저 구하고, 그 값을 기반으로 한 층씩 거.. 2024. 9. 28.
cs231n - lecture05(Trainit NN Part 1) NN 구조에 대한 굉장히 쉬운 설명   Input Layer(정보 수집 Team)입력층은 데이터를 처음 받아들이는 층이다. 비유하자면, 이 층의 각 뉴런들은 특정 작업을 담당하는 사람들이 모인 팀이라고 생각할 수 있. A 뉴런은 "나는 이 이미지의 경계를 살펴볼게"라고 하며, 이미지에서 경계 부분을 분석한다.B 뉴런은 "나는 이 이미지의 색상 패턴을 살펴볼게"라고 하며, 색상 정보를 추출한다.C 뉴런은 "나는 이 이미지의 밝기를 볼게"라고 하며, 이미지의 명암을 분석한다.이렇게 입력층의 뉴런들은 각각의 데이터를 분해하여 기본적인 정보(특징)를 분석한다.  Hidden  Layer(중간 관리자 Team)은닉층은 입력층에서 처리된 기본 정보를 기반으로 더 복잡한 특징을 학습한다. 은닉층을 중간 관리자들이 모.. 2024. 9. 28.
2024.09.27 Q&A 1. 수작업 기반 알고리즘 (SIFT, HOG)가 비효율적인 이유 수작업 기반의 SIFT나 HOG가 비효율적인 이유는 아래와 같다. SIFT나 HOG는 이미지 속에서 사람이 직접 정의한 특징(예: 경계, 코너, 모서리 등)을 찾아낸다. 이 과정에서 어떤 특징이 중요한지 사람이 정해야 한다. 사람이 특징을 정하는 과정은 많은 코스트가 들고, 주관적일 수 있어 만드는 사람마다 모델의 성능이 다를 수 있다.또한, 특정 문제에 대한 도메인 지식이 필요한데, 복잡한 문제에서는 사람이 중요한 특징을 정확하게 정의하기 어렵다.이렇게 사람이 수작업으로 진행해야하는데 한계가 생긴다. 그리고 딥러닝 기반의 CNN 모델은 수많은 데이터를 통해서 스스로 특징을 할 수 있다. 따라서 SIFT나 HOG처럼 수작업으로 학습시키는 .. 2024. 9. 27.
cs231n - lecture04(역전파, 신경망) 역전파(Back Propagation)  아래와 같이 x와 W로 total Loss를 구하는 과정을 Computational Graph라고 한다.  이제 역전파를 계산해보자.  대략적인 방식은 아래와 같다.1. 각 local gradient 2. Chain Rule 적용을 위한 gradient들 구하기 3. Input이 마지막 단에 끼치는 영향 구하기 4. 의미파악      우선 아래와 같은 Computational Graph가 있다고 가정하고 역전파 계산하기    1. local gradient 구하기 - Forward Pass에서 Local Gradient를 구한다.   2. Chain Rule 적용을 위한 gradient들 구하기    3. Input이 마지막 단에 끼치는 영향 구하기 - Back.. 2024. 9. 27.
Numpy - 브로드캐스팅 브로드캐스팅(Broadcasting)은 넘파이에서 크기가 다른 배열들 간의 연산을 할 수 있게 해주는 강력한 기능이다. 일반적으로 크기가 같은 배열끼리만 요소별 연산이 가능하지만, 브로드캐스팅은 크기가 다른 배열끼리도 연산이 가능하게 만들어준다..[브로드캐스팅의 동작원리][브로드캐스팅 규칙]두 배열의 차원이 다른 경우, 더 적은 차원을 가진 배열 Shape의 앞쪽은 1로 채워 차원을 증가시킨다.두 배열의 Shape가 일치하지 않는다면, 일치하지 않는 차원의 Shape가 1인 배열이 다른 Shape와 일치하도록 늘어난다.임의의 차원에서 크기가 일치하지 않고, 1도 아닌 경우에는 오류가 발생하다. 1. 더 적은 차원을 가진 배열은 Shape의 앞쪽이 1로 채워져 차원이 증가한다. 두 배열의 차원이 다를 때,.. 2024. 9. 26.
Numpy - Ufunc ufunc는 유니버설 함수(Universal Function)의 약자이며, 넘파이에서 제공하는 빠르고 효율적인 벡터화된 연산을 지원하는 함수들이다. 단, 동일한 크기를 가진 배열끼리만 가능하다. (브로드 캐스팅으로 해결 가능!) ufunc는 배열의 요소별(element-wise)로 작동하며, 일반적인 산술 연산, 비교 연산, 논리 연산 등을 포함해 다양한 수학적 연산을 빠르게 수행할 수 있다.ufunc의 특징배열 연산을 요소별로 빠르게 수행: 파이썬의 루프를 사용하지 않고도 배열 전체에 대해 연산을 빠르게 처리할 수 있다.벡터화된 연산: 반복문 없이 배열 전체에 대해 연산을 수행함으로써 성능을 크게 향상시킨다.브로드캐스팅 지원: 배열 간 크기가 다를 때도 자동으로 크기를 맞춰서 연산을 수행할 수 있다. .. 2024. 9. 26.
Numpy - 배열 내 요소 접근(인덱싱과 슬라이싱) 1. 인덱싱 [1차원 인덱싱]import numpy as np# 1차원 배열 생성arr1 = np.array([10, 20, 30, 40, 50])# 1차원 배열 인덱싱 예시print("첫 번째 요소:", arr1[0]) # 인덱스 0의 요소print("세 번째 요소:", arr1[2]) # 인덱스 2의 요소print("마지막 요소 (-1 인덱싱):", arr1[-1]) # 마지막 요소---------------------------------------------------# 첫 번째 요소: 10# 세 번째 요소: 30# 마지막 요소 (-1 인덱싱): 50  [2차원 인덱싱]# 2차원 배열 생성arr2 = np.array([[1, 2, 3], [4, 5.. 2024. 9. 26.
Numpy - ndarray의 속성 1. dtype: 배열 요소의 자료형 2. ndim: 배열의 차원 (예시: 1차원, 2차원, 3차원) 3. shape: 배열의 모양 (예시: 1x2, 3x4x5) 4. size: 전체 요소의 개수 [예시 코드]import numpy as np# 2x3 배열 생성arr = np.array([[1, 2, 3], [4, 5, 6]])# 각 속성 출력print("dtype (배열 요소의 자료형):", arr.dtype) # 배열 요소의 자료형print("ndim (배열의 차원):", arr.ndim) # 배열의 차원print("shape (배열의 모양):", arr.shape) # 배열의 모양 (행과 열)print("size (전체 요소의 개수):", arr.size) .. 2024. 9. 26.
Numpy - random 표준편차: 표준편차는 데이터의 흩어짐 정도를 나타내는 통계적 지표이다. 평균을 기준으로 데이터가 얼마나 퍼져 있는지를 측정한다. 값들이 평균에 가까울수록 표준편차는 작고, 값들이 평균에서 멀리 떨어져 있을수록 표준편차는 크다. 쉽게 말해, 표준편차가 크면 데이터가 넓게 퍼져 있고, 표준편차가 작으면 데이터가 평균에 가까이 모여 있다는 것을 의미한다.정규분포: 데이터가 평균을 중심으로 좌우 대칭을 이루며 종 모양을 띠는 분포1. np.random.random(shape): 0과 1 사이의 균일 분포에서 난수를 생성하는 함수로, 지정된 모양(shape)의 배열을 반환함. # (2, 2) 크기의 0과 1 사이의 난수 배열 생성arr = np.random.random((2, 2))print(arr)# - 결과 .. 2024. 9. 26.
Numpy - 배열의 생성 1. empty(shape): 지정한 모양의 배열을 생성하지만, 배열의 값은 초기화되지 않음(쓰레기 값 포함). 따라서, shape는 생성되지만 내부 값은 0이 될 수도, 1이 될 수도, 쓰레기 값이 될 수도 있다. np.empty((2, 3))# array([[6.92367847e-310, 6.92367847e-310, 0.00000000e+000],# [0.00000000e+000, 0.00000000e+000, 0.00000000e+000]])  2. array(object): 리스트, 튜플 등 기존 데이터를 배열로 변환한 것. np.array([1, 2, 3])# array([1, 2, 3])   3. zeros(shape): 지정한 모양(shape)의 배열을 0으로 채워서 생성np.z.. 2024. 9. 26.
2024.09.25 - ch1관련 문제 1. 부울식 F를 무관(don't care)조건 d를 이용하여 (1) SOP, (2) POS로 간소화하여라.F(A, B, C, D) = Σ(0, 2, 4, 12, 14)d(A, B, C ,D) = Σ(1, 5, 8, 10) 풀이) 1. 카르노맵 그리기2. SOP는 1로 채운 카르노 맵 사용하기3. POS는 0으로 채운 카르노 맵 사용하기     3-1. F'을 구한다.     3-2. (F')'을 구한다.   SOP = C'D' + AD' + B'D' POS = (F')' = D(A + B' + C')2. D, JK, T Flip-flop의 특성표(동작표)를 작성하라.  3. D, JK, T Flip-flop의 여기표를 작성하라.  4. 다음 그림과 같은 전가산기와 D Flip-flop으로 구성된 순차회.. 2024. 9. 26.
cs231n - lecture03(손실함수, 경사하강법) Loss function(손실함수):  손실 함수는 모델이 예측한 값과 실제 값 사이의 차이를 수치로 나타내는 함수이다. 쉽게 말해서, 모델이 얼마나 틀렸는지 측정하는 도구이다.    1. Multicalss SVM loss - Hinge loss SVM loss를 Hinge loss라고 부르는 이유는 SVM의 손실 함수가 힌지(Hinge) 모양의 특성을 가지기 때문이다.  쉽게 설명하면:x축: S(j)는 예측값(모델이 예측한 점수)S(yi) 는 정답 클래스의 스코어(점수)고, 이걸 기준으로 예측값 S(j)​가 얼마나 맞았는지 판단한다.y축: 이 축은 손실(Loss)을 나타내. 손실 값은 예측이 잘못되었을 때 증가한다.그래프의 해석:파란색 굵은 선이 바로 힌지 로스 곡선이다.그래프가 1에서 꺾이는 지점을.. 2024. 9. 23.