프로그램 오류 프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우가 있다. 이러한 결과를 초래하는 원인을 프로그램 에러 또는 오류라고 한다. 에러의 발생 시점에 따라 컴파일 에러와 런타임 에러로 나눌 수 있는데, 컴파일 에러(compile-time error)는 컴파일할 때 발생하는 에러이고 프로그램의 실행 도중에 발생하는 에러를 런타임 에러(runtime error)라고 한다. 소스코드를 컴파일하면 컴파일러가 소스코드(*.java)에 대해 오타나 잘못된 구문, 자료형 체크 등의 기본적인 검사를 수행하여 오류가 있는지 알려 준다. 하지만 컴파일을 에러 없이 성공적으로 마쳤다고 해서 프로그램의 실행 시에도 에러가 발생하지 않는 것은 아니다. 컴파일러가 소스코드의 기본적인 사항..
성능의 정의 두 데스크톱 컴퓨터에서 같은 프로그램을 실행시키는 경우에 먼저 끝나는 쪽이 더 빠른 컴퓨터라고 할 수 있을 것이다. 그러나 여러 대의 서버를 가지고 여러 사용자의 작업을 처리하는 데이터센터를 운영할 때는 하루 동안 더 많은 작업을 처리하는 컴퓨터가 더 빠른 컴퓨터일 것이다. 컴퓨터 사용자 개인의 입장에서는 응답 시간(response time) - 작업 개시에서 종료까지의 시간 - 즉 실행시간(execution time)이 중요할 것이다. 그러나 데이터센터 관리자에게는 처리량(throughput), 혹은 대역폭(bandwidth)- 일정한 시간 동안 처리하는 작업의 양 이 더 중요하다. 그러므로 개인 휴대용 기기와 서버의 성능을 평가할 때 다른 성능 척도를 사용한다. 혼돈을 피하기 위하여 컴퓨..
트랜지스터(transistor)는 한 마디로 전기로 제어되는 온/오프 스위치이다. 집적회로(integrated circuit, IC)는 수십, 수백 개의 트랜지스터를 칩 하나에 집적시킨 것이다. 집적회로의 집적도는 매우 일정한 속도로 증가하고 있다. 어떻게 집적회로를 만드는지 이해하기 위해서 맨 처음부터 시작하도록 하자. 집적회로 칩의 생산은 모래의 구성 성분인 실리콘에서부터 출발한다. 실리콘(sili-con)은 전기를 통하기는 하는데 썩 잘 통하는 편은 아니어서 반도체(semiconductor)라고 부른다. 특수한 화학적 처리를 거쳐 불순물을 첨가하면 실리콘의 작은 부분을 다음 세 가지 중 하나로 바꿀 수 있다. 전기의 양동체(초소형 구리나 알루미늄 전선) 전기 절연체(플라스틱 피복이나 유리 등) 조건..
디스플레이 대부분의 개인 휴대용 기기들은 얇고 전력 소모가 적은 LCD(liquid crystal display)를 사용한다. LCD는 스스로 빛을 내는 대신 통과하는 빛을 제어한다. 전형적인 LCD에는 액체 상태의 막대 모양 분자가 있어서 디스플레이에 들어오는 빛을 굴절시킨다. 터치스크린 터치스크린(touchscreen)을 구현하는 다양한 방법이 있는데 오늘날의 많은 태블릿은 정전용량 감지 기법을 사용한다. 유리 같은 절연체 위에 투명한 도체를 코팅하면, 사람이 손을 댔을 때 손에 전기가 통하기 때문에 스크린의 정전기장이 찌그러지면서 정전용량이 변하게 된다. 이 기술은 여러 군데 동시에 손을 대는 것도 허용하며, 손의 동작까지 감지해서 멋진 사용자 인터페이스를 만들 수 있게도 한다. 상자를 열고 프로세..
컴퓨터 하드웨어는 아주 단순한 저수준의 명령어만 실행할 수 있다. 복잡한 응용에서 출발해서 단순한 명령어까지 내려가려면 높은 수준의 작업을 단순한 컴퓨터 명령어로 번역 또는 해독하는 여러 겹의 소프트웨어가 필요하다. 이것이 추상화라고 하는 위대한 아이디어의 한 예이다. 이러한 소프트웨어들은 계층적으로 구성된다. 그림과 같이 응용 프로그램이 가장 바깥쪽에 위치하며, 여러 시스템 소프트웨어가 하드웨어와 응용 소프트웨어 사이에 존재한다. 시스템 소프트웨어에는 여러 가지가 있으나, 현대 컴퓨터 시스템에서 핵심이 되는 두 가지는 운영체제와 컴파일러이다. 운영체제는 사용자 프로그램과 하드웨어 간의 인터페이스 역할을 하면서 각종 서비스와 감독 기능을 제공한다. 기본적 입출력 작업의 처리 보조기억장치 및 메모리 할당 ..
인터페이스란? 인터페이스란 일종의 추상 클래스이다. 인터페이스는 추상 클래스처럼 추상 메서드를 갖지만 추상 클래스보다 추상화 정도가 높아서 추상 클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버 변수를 가질 수 없다. 오직 추상 메서드와 상수만을 멤버로 가질 수 있다. 추상 클래스를 부분적으로만 완성된 '미완성 설계도'라고 한다면, 인터페이스는 구현된 것은 아무것도 없고 밑그림만 그려져 있는 '기본 설계도'라 할 수 있다. 인터페이스도 추상 클래스처럼 불완전한 것이기 때문에 그 자체만으로 사용되기보다 다른 클래스를 작성하는데 도움 줄 목적으로 작성된다. 인터페이스의 작성 'class' 대신 키워드 'interface'를 이용하여 작성할 수 있다. interface에도 클래스와 같이 접근제어자로 publi..
추상클래스란? 클래스를 설계도에 비유한다면, 추상클래스는 미완성 설계도에 비유할 수 있다. 클래스가 미완성이라는 것은 멤버의 개수에 관계된 것이 아니라, 단지 미완성 메서드(추상 메서드)를 포함하고 있다는 의미이다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상 클래스로 인스턴스는 생성할 수 없다. 추상 클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다. 추상클래스 자체로는 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는 데 있어서 바탕이 되는 조상 클래스로서 중요한 의미를 갖는다. 새로운 클래스를 작성할 때 아무것도 없는 상태에 시작하는 것보다는 완전하지는 못하더라도 어느 정도 틀을 갖춘 상태에서 시작하는 것이 나을 것이다. 문법 추상 클래스는 키워드 'abstract'를 붙..
다형성이란? 객체지향 개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며, 자바에서는 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였다. 요약하면 조상 클래스 타입의 참조 변수로 자손 클래스의 인스턴스를 참조할 수 있다. class Tv { boolean power; int channel; void power() { power = !power; } void channelUp() { ++channel; } void channelDown() { --channel; } } class CaptionTv extends Tv { String text; void caption() { } } 클래스 Tv와 CatptionTv는 서로 상속관계에 있..
제어자란? 제어자(modifier)는 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다. 제어자의 종류는 크게 접근 제어자와 그 외의 제어자로 나눌 수 있다. 접근 제어자 public, protected, default, private 그 외 static, final, abstract, native, transient, synchronized, volatile, strictfp 제어자는 클래스나 멤버 변수와 메서드에 주로 사용되며, 하나의 대상에 대해서 여러 제어자를 조합하여 사용하는 것이 가능하다. 단, 접근 제어자는 하나의 대상에 대해서 하나만 선택해서 사용할 수 있다. static - 클래스의, 공통적인 static은 '클래스의' 또는 '공통적인'의 의미를 가지고 있다. ..
오버라이딩이란? 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다. 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야 하는 경우가 많다. 이럴 때 조상의 메서드를 오버라이딩한다. 오버라이딩의 조건 자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 - 이름이 같아야 한다. - 매개변수가 같아야 한다. - 반환 타입이 같아야 한다. 요약하면 선언부가 서로 일치해야 한다. 다만 접근 제어자와 예외는 제한된 조건 하에서만 다르게 변경할 수 있다. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다. 만약 조상 클래스에 정의된 메서드의 접근 제어자가 protected라면, 이를 오버라이딩하는 자손 클래스의 메서드는 접근 제어자가..
상속의 정의와 장점 상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 유리하다. 이러한 특징은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다. 상속 구현 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 'extends'와 써주면 된다. class Child extends Parent { // ... } 이 두 클래스는 서로 상속 관계에 있다고 하며, 상속해주는 클래스를 '조상(or 부모, 상위, 기반) 클래스'라 하고 상속받는 클래스를 '자손(or 자..
같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 아래 조건을 만족하면 생성자 간에도 서로 호출이 가능하다. - 생성자의 이름으로 클래스 이름 대신 this를 사용한다. - 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다. 아래 코드는 위의 두 조건을 만족시키지 못했기 때문에 에러가 발생한다. class Car { String color; int door; String gearType; Car(String color) { door = 5; Car(color, "auto", 4); } } 에러가 발생한 이유. 생성자 내에서 다른 생성자를 호출할 때 this를 사용하지 않음. 두 번째 줄에서 생성자 호출. this(color, "auto", 4)로 해야 한다. 생성자에서 다..