분류 전체보기 495

[컴퓨터구조] 하드웨어의 덧셈과 뺄셈 오버플로우

컴퓨터는 ALU에서 연산을 수행합니다. 그렇다면 컴퓨터는 어떻게 연산을 수행할 수 있을까요? 오버플로우가 발생하는지는 어떻게 알 수 있을까요? 구체적으로 알아보겠습니다. 정수의 덧셈 먼저 컴퓨터는 이진수를 사용합니다. 4비트로 표현할 수 있다고 가정할 때 정수의 덧셈을 확인해보겠습니다. 3+4 = 7 입니다. 이는 이진수로 표현하면 0011(2) + 0100(2)입니다. 이를 이진수 연산을 통해 각 자리 수를 더해주면 0111(2) = 7이라는 결과가 나옵니다. 정수의 뺄셈 -3 + 3 = 0입니다. 이를 이진수로 표현하면 1101(2) + 0011(2) = 0입니다. 4비트를 넘어가는 수는 버리기 때문입니다. 정수의 덧셈,뺄셈 오버플로우 앞서 덧셈과 뺄셈은 간단한 연산이므로 넘어가고 오버플로우가 발생하..

CS/컴퓨터구조 2022.10.14

3NF 와 BCNF의 차이점 정리

정규화에는 1정규화, 2정규화,... 5정규화가 있습니다. 그 중 3 정규화는 3NF라고 하는데, 이와 유사한 BCNF가 있습니다. 이 둘의 개념은 구분하기 어렵고 따라서 이번 포스팅에서는 이 둘을 상세히 비교해보려고 합니다. 3NF 3정규화 1. 개념 제 2정규화를 만족하는 동시에 prime attribute가 아닌 속성들이 Primary key에 dependent하거나, 참조당하는 속성이 prime attribute이어야 합니다. 잘 이해가 안되므로 아래의 예시를 통해 설명하겠습니다. Definition of 3NF: X -> A (a) X is a superkey of R or (b) A is a prime attribute of R * prime attribute는 키를 구성하는 attribute..

[Kotlin] 객체

객체는 오직 하나의 인스턴스만 존재하는 클래스는 object 키워드로 정의하며 객체라고 부릅니다. 객체에는 여러 종류가 있습니다. 이는 기존의 java와 큰 차이가 있는 부분이므로 이번 포스팅에서 정리해보려고 합니다. 객체 오직 하나의 인스턴스만 존재하는 클래스로 object라는 키워드로 정의하며 객체라고 부릅니다. 이러한 객체는 선언과 동시에 인스턴스가 생성됩니다. object Application { val name = "My Application" override fun toString() = name } 내포 객체 특정 클래스의 모든 인스턴스가 공유하는 객체를 의미합니다. 팩토리 디자인 패턴이 그 예라고 할 수 있습니다. class Application private constructor(val ..

[컴퓨터구조] 명령어의 주소 지정 방식

명령어의 피연산자필드를 사용해, 데이터 유효주소를 결정하는 방식입니다. 0단계 주소지정방식 유효주소를 확정하기 위해 연산을 0번 수행합니다. 1) 즉시 주소지정 방식 명령어 피연산자 필드에 실제 데이터가 포함됩니다. 명령어 decode 시에 사용할 데이터가 바로 인출됩니다. 보통 프로그램의 초기 환경값을 세팅할 때 자주 사용됩니다. 장점: 레지스터 액세스조차 없이 수행됩니다. 단점: 피연산자에 해당하는 bit수로 표현할 수 있는 데이터만 제한적으로 사용 가능합니다. 2) 묵시적 주소지정 방식 명령어 실행에 필요한 데이터의 위치가 묵시적으로 지정됩니다. 스택이나 누산기처럼 저장할 위치가 이미 저장되어있는 경우에 해당합니다. 장점: 명령어의 길이가 짧고, cpu 내에서 연산이 수행됩니다. 단점: 컴퓨터 구조..

CS/컴퓨터구조 2022.10.12

[Kotlin] 프로퍼티

description 코틀린 프로퍼티 1. 최상위 프로퍼티 클래스에 포함되지 않은 프로퍼티로 전역 변수/ 상수의 역할을 하는 프로퍼티입니다. public/internal/private 등의 가시성 지정이 가능합니다. private val prefix = "Hello World" fun main () { fun readInt() = readLine()!!.toInt() } 2. 늦은 초기화 생성자에서 초기화 되지는 않지만, 프로그램 흐름 상 실 사용 시에는 초기화 되는 것이 명백할 경우가 있씁니다. 이런 경우 lateinit이라는 예약어를 사용합니다. 하지만 이 경우 프로그래머가 반드시 초기화하는 코드를 작성해주어야합니다. 만약 실수로 초기화를 하지 않는 경우 UninitializedPropertyAcce..

[Kotlin] null 정리

코틀린에서는 자바와 달리 null을 컴파일 시점에 관리할 수 있습니다. 또한 최상위 프로퍼티, get(), set() 등 자바에서 지원하지 않는 다양항 기능들을 제공합니다. 이번 포스팅에서는 null 관리와, 프로퍼티에 대해 상세히 알아보겠습니다. 코틀린 null null: 아무 것도 참조하지 않는 참조 값의 특별한 상태입니다. null에 대해 멤버 접근을 시도하면 NullPointerException이 발생하는데 이는 최악의 에러 중 하나입니다. 그런데 코틀린에서는 일반 참조형에서는 null을 담을 수 없게 하여 NPE를 예방합니다. 예제 코드 fun isLetterString(s: String) : Boolean { if(s.isEmpty()) return false for(ch in s) { if ..

[컴퓨터구조] 명령어 집합 분류

명령어 집합은 피연산자의 수에 따라 나뉘기도 합니다. 또한 피연산자의 수에 따라 컴퓨터 구조도 달라집니다. 스택, 누산기, 범용 레지스터 컴퓨터로 구분할 수 있는데, 각각은 명령어를 실행할 때의 트래픽 byte수가 다릅니다. 이번 포스팅에서는 이 세가지를 상세히 비교하며 이해해보도록 하겠습니다. 피연산자의 수와 명령어 집합 1. 명령어 구성 연산 부호(opcode): 어떤 연산을 수행할 것인가 피연산자(operand): 연산의 대상이 되는 데이터들의 위치 또는 값의 정보 2. 피연산자 수에 따른 컴퓨터 구조 종류 1) 스택 컴퓨터 2) 누산기 컴퓨터 3) 범용 레지스터 컴퓨터 3. 컴퓨터 성능에 영향을 미치는 cpu-M 병목 트래픽 명령어 인출: 7 * 5byte = 35 byte 데이터 전송: mul/..

CS/컴퓨터구조 2022.10.10

[Kotlin] 코틀린 클래스, 생성자

description 코틀린 클래스 1. 코틀린의 클래스는 자바와 마찬가지로 기본 public입니다. 2. 코틀린의 클래스 프로퍼티는 초기화해주어야 합니다. 그렇지 않은 경우 컴파일 에러가 발생합니다. 3. 멤버 가시성 클래스 내부의 멤버(프로퍼티, 메서드)마다 가시성이 설정 가능합니다. public: 멤버를 어디서나 볼 수 있습니다. internal: 컴파일 모듈 내부에서만 멤버를 볼 수 있습니다. protected: 멤버가 속한 클래스와 그 하위 클래스에서만 볼 수 있습니다. (패키지 수준에서 protected X) private: 멤버가 속한 클래스에서만 볼 수 있습니다. 4. 내포된 클래스 클래스 안에 클래스를 선언할 수 있습니다. class Person2(val id: Id, val age: I..

[Kotlin] 코틀린 함수

이번 포스팅에서는 코틀린 함수의 특징에 대해 알아보겠습니다. 코틀린 함수 특징 1. 파라미터의 타입은 항상 지정해야 합니다. fun circle(radius: Double): Double // (O) fun circle(radius): Double // (X) 2. 반환값이 없는 경우에만 반환값의 타입을 생략할 수 있습니다. 이는 자바의 void와 같습니다. 참고로 Kotlin에서는 Unit이라는 예약어를 사용합니다.(그 Unit이라는 타입을 생략가능) 3. 함수 파라미터의 값은 val 타입이라 값이 바뀌는 것이 허용되지 않습니다. 4. 코드를 = 로 수정할 수 있습니다. 참고로 반환값 타입 유추가 가능한 경우 반환 타입을 생략해줄 수 있습니다. fun circle(radius: Double): Doub..

[Kotlin] 코틀린 문자열과 배열

코틀린에도 문자열과 배열이 있습니다. 언어마다 각각의 특성이 다르기 때문에 아는 것이라 할지라도 한번은 특징을 확인해볼 필요가 있습니다. 이번 포스팅에서는 간략하게 코틀린에서 문자열과 배열의 특징을 알아보겠습니다. 코틀린 문자열 1. kotlin에서 문자열은 String 객체이고 문자 배열이 아닙니다. 따라서 문자열 리터럴 그 자체는 바뀌지 않습니다. 2. C와 마찬가지로 \(이스케이프 시퀀스)를 이용해 특수 문자를 표현합니다. ex) val text = "Hello World!\n" 3. 문자열 템플릿 기능이 있습니다. 문자열 내부 ${}의 중괄호 사이에 표현식을 넣는 것입니다. val name = "Charlie" println("Hello $name Today is ${Date()}") 4. 로우 ..