컴퓨터의 개념
<컴퓨터의 개념>
1. 컴퓨터란?
컴퓨터(Computer)란 '계산을 하는 기계'라는 뜻이지만, 단순한 계산기를 뜻하는 것이 아닌 데이터를 처리하는 장치이다. 외부로부터 대량의 자료를 입력 받아 일련의 처리 과정을 거쳐 유용한 정보를 생성하여 사용자에게 제공해주는 전자 자료 처리 시스템(EDPS: Electronic Data Processing System)이다.
컴퓨터(Computer)란 '계산을 하는 기계'라는 뜻이지만, 단순한 계산기를 뜻하는 것이 아닌 데이터를 처리하는 장치이다. 외부로부터 대량의 자료를 입력 받아 일련의 처리 과정을 거쳐 유용한 정보를 생성하여 사용자에게 제공해주는 전자 자료 처리 시스템(EDPS: Electronic Data Processing System)이다.
제 2장 클래스/ 객체/ 트레이드
답글삭제스칼라는 함수형 언어인 동시에 객체 지향형 언어이다.
단순히 객체 지향적인 면을 가져다 쓰는 것이 아니라 오히려 자바보다 훨씬 객체지향적이다 자바에서는 연산자와 메서드 자체를 객체라고 할 수 없는 반면, 스칼라에서는 연산자와 메서드를 포함한 모든 것이 객체이다
클래스와 객체
스칼라에서 객체를 생성하는 방법은 크게 두 가지 이다 하나는 클래스를 통한 인스턴스화이며, 나머지 하나는 object 예약어를 통해 객체를 바로 생성하는 것이다
즉 다음 두 문장으로 정리할 수 있다
1. 스칼라 클래스는 new를 통해 계속 인스턴스를 생성할 수 있다
2. 스칼라 객체는 싱글턴 객체로서 그 자체가 인스턴스이며 유일하다
스칼라의 객체는 싱글턴으로 설계되어 있다 즉, object 이름을 달고 그 안에 여러 메서드를 구현 한다면 해당 메서드를 쓰기 위해 굳이 new를 쓸 필요가 없다
스칼라에서의 static
자바나 스칼라나 C++이든 프로그램을 실행하기 위해서는 main 이라는 이름을 가진 시작 메서드가 하나라도 존재해야한다
스칼라에서는 객체이든가, 아니면 아직 인스턴스화 되지 않은 클래스이든가 둘 중 하나이다 이러한 이유로 public class대신 object 예약어를 통해 아예 처음부터 메모리에 객체를 생성해버리고, 컴파일러는 이 실물 안에 main 이라는 이름이 있다면 이를 프로그램의 시작점으로 생각하고 컴파일한다
스칼라에서의 생성자
보통, 생성자는 클래스를 인스턴스화할 떄 값을 초기화하는 역활을 담당한다 스칼라에서는 값의 초기화가 필요하다면 직접 멤버 변수를 명시할 때 값을 주면 된다
참고로 스칼라에서는 자바처럼 클래스 파일을 다른 곳을 뺴서 하나의 파일로 만드는 일이 드물다. 자바에서는 .class 파일이 항상 외부에 존재하면서 이 파일 안에 생성자, 게터, 세터, toString 메서드 등 필요한 로직이 모두 들어간다.
그래서 이러한 파일을 만들면 변경이 필요할때 시간이 오래 걸리는 단점이 있기 때문에 스칼라는 이러한 과정을 싫어하기 때문에 클래스의 구현부를 없애는 것 또한 가능하다
class Vehicle(a: Int, b: Int)
답글삭제위의 클래스 선언문은 자바에서의 다음 코드와 같은 기능을 한다
class Vehicle{ //자바코드
private int a;
private int b;
public Vehicle(int a, int b){
this.a = a;
this.b = b;
}
}
스칼라에서 클래스를 통해 객체를 생성하는법
일반적인 스칼라 클래스 생성법
object Ex 1_1{
def main(agrs: Array[String]) = {
val apple = new Fruit("사과")
println(apple.name)
}
}
class Fruit(input: String) {
var name = input
}
결과
사과
위에서 언급했듯이 Fruit 클래스는 다음과 같이 더 간단하게 선언 할 수도 잇다
class Fruit(name: String)
다만 이렇게 축약 방식으로 클래스를 만들면, 멤버 변수들이 모두 private으로 생성되기 때문에 위 코드처럼 변수에 바로 접근할 수가 없다. 그래서 스칼라는 다음과 같이 케이스 클래스를 사용할 수 있다
case class Fruit(name: String)
케이스 클래스는 클래스에서 조금 더 기능을 확장한 클래스이다 자동으로name 이라는 이름을 가진 멤버 변수를 만들어 주며, 이는 외부에서도 얼마든지 접근이 가능하다 또한 , 객체의 정보를 알 수 있게 해주는 toString, 그 밖에도 자주 오버라이드 하는 hashCode나 equals 메서드를 모두 알아서 생성해준다
케이스 클래스의 편리함
object Ex 1_1{
def main(agrs: Array[String]) = {
val apple = Fruit2("사과") // 케이스 클래스는 new를 생략 가능하다
println(apple.name)
}
}
결과
사과
Tip 객체 이름과 클래스의 이름이 같다면
같아도 생성이 가능하다 스칼라는 자바에는 없는 동반 객체를 제공한다.
단순히 같은 이름으로 지정할 수 있다는 점 외에도, 동반객체와 클래스는 각자의 private 필드나 메서드를 서로 자유롭게 접근 할 수 있다는 특성이 있다
답글삭제상속
상속이란 부모클래스가 자식클래스에게 상속을 해주는 것을 말하며 상속을 받은 자식클래스는 부모클래스의 기능을 모두 사용할 수 있다
트레이드와 추상클래스
트레이트라는 단어는 '특성'이라는 뜻이다 즉, 그 자체로 하나의 완성된 기능이라기보다는 어떠한 객체에 추가될 수 있는 부가적인 하나의 특성이다. 예를 들어 붕어빵 틀인 클래스에 여러가지 특성을 부가할 수 있다 트레이트는 클래스의 부가적인 특성으로 작동한다
추상클래스는 자바에 존재하는 추상 클래스와 같다 추상 클래스 안에는 개발자가 상속 받아 구현하는 미구현 메서드가 존재하기 대문에 그 자체로 인스턴스화될 수는 없고 반드시 온전한 클래스에서 추상 클래스를 상속받아 구현을 완료해야한다
트레이트와 추상 클래스의 공통점은 그 자체로 인스턴스화가 가능하지 않다
표 트레이트, 추상 클래스, 인터페이스
트레이트 추상클래스 인터페이스
메서드 구현 가능 0 0 x
다중상속 가능 0(믹스인) x 0
변수 선언 가능 0 0 x
인스턴스 생성 x x x
만약 트레이트에서 구현된 메서드를 덮어버리고 새로운 로직을 구형하고 싶을 때는 오버라이드하는 방법이 있다
override라는 예약어를 이용해 기존의 로직과 다른 새로운 기능을 만들어낼 수 있다 이 예약어가 없을 때는 오버라이드 시 컴파일 에러가 나므로 조심할 필요가 있다
class Animal extends Flying with Swimming {
override def fly = println("오버라이드 된 메서드")
}
트레이트는 추상클래스와 경쟁하기보다는 궁합이 맞게 쓸수 있다
트레이트 상속
기능이 모두 구현 되어 있는 일반 클래스나 일부 기능이 구현되어 있는 추상 클ㄹ래스 여러개를 한 클래스에서 상속받을 경우 '다이아 몬드 상속' 의 문제가 생길 수가 ㅣㅇㅆ다
다이아 몬드 상속 문제
스칼라는 이러한 문제를 정면으로 대응한다 필요하다면 B나 C둘중 하나만 실행하거나 아니면 B나 C 모두의 기능을 실행하는 식이다 이도 저도 마음에 들지 않으면 최종적으로 상속을 받는 일반 클래스에서 재구현할 수도 있다
트레이트는 그 자체가 강력한 기능을 담을 수도 있고 단순한 하나의 틀로만 작동 시킬 수도 있다 여러가지 기능을 순차적으로 실행시킬 수도 있다 이처럼 트에이트는 스칼라에서 굉장히 비중 있는 존재이며, 상당수의 라이브러리가 내부적으로 트레이트로 구현되어 있다. 트레이트를 이해한다면 스칼라의 구조에 더 깊게 다가 섰다고 할 수 있다
다음 정리는 CPU 스케줄링
답글삭제