이 글의 사진과 내용은 공룡책 과 컴퓨터학부 수업인 운영체제 강의자료를 기반으로 작성했습니다.
OS
는 컴퓨터 하드웨어 바로 윗단에 설치되는 소프트웨어.
각종 SW들은 위의 그림과 같이 HW와 OS가 한 몸으로 존재하는 컴퓨터 시스템 위에서 수행되는 것으로 볼 수 있다.
컴퓨터 전원을 On 하면, OS는 이와 동시에 실행된다.
OS 중 항상 필요한 부분만을 전원이 On과 동시에 메모리에 올려놓고 그렇지 않은 부분은 필요할 때 메모리에 올려서 사용하게 된다.
이때 메모리에 상주하는 운영체제의 부분을 커널(kernel)
이라고 부르며 이를 좁은 의미의 운영체제라고도 부른다.
즉 커널은 운영체제 코드 중에서도 핵심적인 부분을 뜻한다.
컴퓨터 HW와 User 사이에 OS가 존재하므로, OS의 역할은 HW를 위한 역할
과 User를 위한 역할
의 두 가지로 나누어볼 수 있다.
HW
쪽에서는 User가 직접 다루기 힘든 각종 HW를 OS가 관리하는 역할을 하며, User
에게는 편리한 Interface를 제공하는 역할을 한다.
OS의 두 가지 주요 기능
[1] 컴퓨터 시스템 내의 자원을 효율적으로 관리하는 것 -> 중요한 핵심 기능
[2] .컴퓨터 시스템을 편리하게 사용할 수 있는 환경을 제공하는 것
OS를 자원관리자(resource manager)
라고 부르기도 한다.
자원
이란 CPU, Memory, HardDisk 등 HW 자원뿐 아니라 SW 자원까지를 통칭해서 부르는 말이다.OS는 사용자 및 프로그램들 간에 자원이 형평성 있게 분배되도록 하는 균형자
역할도 함께 수행해야 한다.
효율성이 가장 큰 목표이지만 이로 인해 일부가 지나치게 희생되지 않게 하는 형평성 역시 OS가 고려해야할 목표이다.
이 밖에도 OS는 사용자와 OS 자신을 보호하는 역할을 담당하기도 한다.
OS를 분류하는 기준 동시 작업
이 있다.
동시 작업을 지원하는 여부
단일작업용 OS : 한 번에 하나의 프로그램만 실행 시킬 수 있다.
다중작업용 OS : 2개 이상의 프로그램을 처리할 수 있다.
OS가 다중작업을 처리할 때에는 여러 프로그램이 CPU와 메모리를 공유하게 된다. 참고로 컴퓨터 1개당 CPU는 1개만 존재한다.
하지만, CPU의 처리 속도가 워낙 빨라 짧은 시간의 규모로 여러 프로그램들이 CPU에서 번갈아 실행된다. 그렇기 때문에 사용자 입장에서는 여러 프로그램이 동시에 실행되는 것처럼 보인다. 이와 같이 CPU의 작업시간을 여러 프로그램들이 조금씩 나누어 쓰는 시스템을 시분할 시스템
이라고 부른다.
CPU와 달리 메모리
의 경우 여러 프로그램들이 조금씩 메모리 공간을 보유하며 동시에 메모리에 올라가 있을 수 있다.
이처럼 메모리 공간을 분할해 여러 프로그램들이 동시에 메모리에 올려놓고 처리하는 시스템을 다중 프로그래밍 시스템
이라고 부른다.
다중작업용 OS경우 여러 프로그램을 같이 실행시키지만
대화형 시스템
이라고 부른다.다중작업, 시분할, 다중 프로그래밍, 대화형 시스템은 모두 여러 프로그램이 하나의 컴퓨터에서 동시에 실행된다.
다중처리기 시스템
은 하나의 컴퓨터 안에 CPU가 여러 개 설치된 경우를 뜻하므로 앞의 용어들과는 의미가 다르다.
CPU가 여럿 있는 컴퓨터는 서로 다른 CPU에서 여러 프로그램이 동시에 실행될 수 있어 처리가 더욱 빨라지지만,
OS를 분류하는 또다른 기준은다중 사용자에 대한 동시 지원
이다.
OS를 분류하는 또 다른 기준은 작업을 처리하는 방식
이다.
코드가 많아지고 길어질수록 나중에 기능을 수정할때마다 코드를 갈아엎어야 하는 경우가 많다.
한마디로 유지보수가 너무 불편한 경우가 있다.
그래서 프로그래머들이 유지보수성, 애플리케이션의 확장성, 그리고 유연성이 증가하고, 중복코딩이라는 문제점 또한 사라지는 효과를 가질 수 있기 때문에 Spring MVC라는 구조를 만들었다.
Model : 데이터와 관련된 부분
View : 사용자한테 보여지는 부분
Controller : Model과 View를 이어주는 부분
Model은 Controller와 View에 의존하지 않아야 한다.(Model 내부에 Controller와 View에 관한 코드가 있으면 안된다.)
View는 Model
에만 의존해야하고, Controller에는 의존하면 안된다. (View 내부에 Model 코드만 있을 수 있고, Controller 코드는 있으면 안된다.)
View가 Model로부터 데이터를 받을 때, 사용자마다 다르게 보여주어야 하는 데이터에 대해서만 받아야 한다.
Controller는 Model
과 View
에 의존해도 된다.(Controller 내부에는 Model과 View의 코드가 있을 수 있다.)
View가 Model로부터 데이터를 받을 때, 반드시 Controller에서 받아야 한다.
Mac기준으로 인텔리제이를 쓰면서 유용한 단축키 기능들을 정리해보려고 한다.
정리한 이후에도 유용한 단축키를 알게되면 추가적으로 업로드를 할 예정이다.
cmd + n
을 눌러서 Getter & Setter을 클릭하고 원하는 변수를 선택하여 ok 버튼을 클릭하면 자동으로 추가된다.
cmd + n
을 눌러서 Constructor을 클릭하여 위와 같은 방식으로 처리하면 this가 자동으로 추가된다.
cmd + n
을 눌러서 toString
을 입력하여 클릭하고 위와 같은 방식으로 처리하면 toString이 자동으로 추가된다.
import가 필요한 경우 option + enter
를 누르면 “Implement methods” 를 선택한 다음에
해당 변수들을 선택하고 ok버튼을 클릭하면 다음과 같이 자동으로 추가된 것을 확인할 수 있다.
이름을 변경하고 싶으면 option + enter
를 누르고 “Rename file”을 선택하면 된다.
cmd + shift + enter
누르면 세미콜론까지 자동으로 입력된다.cmd + option + L
을 누르면 자동으로 정렬이 된다.방법1 : control + t
누르고 Inline Variable 클릭하면 된다.
방법2 : cmd + option + n
(Inline Variable 단축키)
방법2 예시
[변경 전]
public class MemberRepository {
/* ... */
public List<Member> findALl() {
List<Member> result = em.createQuery("select m from Member m", Member.class)
.getResultList();
return result;
}
}
cmd + option + n
을 누르면 다음과 같이 단축된다.[변경 후]
public class MemberRepository {
/* ... */
public List<Member> findALl() {
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
}
자바 언어는 플랫폼에 독립적으로 설계되었다.
자바 코드는 운영체제나 CPU 등 플랫폼에 상관없이 자바 가상 기계(JVM)만 있으면 어떤 컴퓨터에서든 동일하게 실행된다. 이를 WORA(Write Once Run Anywhere) 라고 한다.
한 번 작성된 자바 프로그램은 수정 없이 실행 가능하다.
바이트 코드(byte code)는 자바 컴파일러가 자바 소스 프로그램을 컴파일한 일종의 기계어로서, 자바 가상 기계(Java Virtual Machine, JVM)에 의해 실행되는 바이너리 코드(binary code)이다.
바이트 코드는 자바 가상 기계에 의해 인터프리터 방식으로 한 명령씩 해석되어 실행된다.
자바 프로그램 입장에서 볼때 자바 가상 기계는 운영체제이자 컴퓨터이다.
자바 가상 기계는 플랫폼에 적합하게 서로 다르게 구현되므로 플랫폼 종속적이다.
자바 컴파일러는 자바 소스 프로그램을 컴파일하여 바이트 코드를 클래스 파일(class file)에 저장한다.
자바 프로그램이 실행되기 위해서는 개발자가 작성한 자바 프로그램 외에 자바 플랫폼에서 제공하는 다양한 클래스 라이브러리(자바 APIs)가 반드시 필요하다.
C/C++는 컴파일한 목적 파일을 링크시켜 하나의 실행파일(exe)을 만들며, 이 실행 파일 하나만 있으면 실행 가능하다. 그리고 이 실행 파일은 컴퓨터의 CPU가 바로 실행한다.
Java의 경우 링크 과정이 없으며 자바 가상 기계가 컴파일된 클래스 파일을 실행한다.
JDK(Java Development Kit)는 자바 개발자를 위한 상업용 소프트웨어로, 자바 컴파일러 등의 개발 도구와 JRE(Java Runtime Environment)로 구성된다.
JRE는 자바 응용프로그램이 실행될 때 필요한 소프트웨어들로 개발자가 활용할 수 있는 자바 API(이미 컴파일된 다양한 클래스 라이브러리)와 자바 가상 기계를 포함한다.
IDE(Integrated Development Environment)란 소스 코드 편집, 컴파일, 디버깅을 한꺼번에 할 수 있는 소프트웨어 통합 개발 환경을 일컫는다.
C/C++ → 비주얼 스튜디오 / Java → 이클립스(eclipse)
이클립스는 자바 언어로 개발된 데스크톱 응용프로그램이다.
플랫폼 독립성 - 자바 가상 기계만 있으면 자바 프로그램의 실행이 가능하다.
객체 지향 - 캡슐화, 상속, 다형성 등을 지원한다. 객체 지향 프로그램은 해결할 과제를 실제 세상의 객체와 객체간의 상호 관계로 모델링하여 인간의 사고에 가깝게 표현한다.
클래스로 캡슐화 - 자바는 변수나 메소드는 반드시 클래스 내에 구현하도록 한다.
소스와 클래스 파일 - 자바 소스가 컴파일된 클래스 파일(.class)는 반드시 하나의 자바 클래스만이 들어있다.
실행 코드 배포 - 다수의 클래스 파일을 jar 파일 형태로 압축하여 배포 및 실행이 가능하다.
패키지 - 서로 관련 있는 클래스는 패키지로 묶어 관리한다.
멀티스레드 - 하나의 자바 프로그램에서 다수의 스레드가 동시에 실행할 수 있는 환경을 지원한다.
가비지 컬렉션 - 자바 언어는 메모리를 반환하는 기능이 없다. 프로그램 내에 사용되지 않는 메모리는 자바 가상 기계의 가비지 컬렌셕 기능에 의해 자동으로 회수된다.
실시간 응용 시스템에 부적합 - 자바 응용프로그램은 실행 도중 예측할 수 없는 시점에 가비지 컬렉션이 실행되므로, 프로그램이 일시적으로 중단된다.
public class Hello {
...
}
public 은 다른 클래스에서 Hello 클래스를 자유롭게 참조할 수 있다.
public static void main(String[] args) {
...
}
main()은 반드시 public static void 로 선언되어야 하며, 한 클래스는 두 개 이상의 main()을 가질 수 없다.
메소드
C/C++ 함수를 자바에서는 메소드(method)라고 부르며, 반드시 클래스 내에 작성되어야 한다.
화면 출력
System.out.println("Hello"); // "Hello" 문자출력
정수, 문자, 문자열 등 데이터를 화면에 출력하기 위해 System.out.println()을 이용한다.
식별자(identifier): 클래수, 변수, 상수, 메소드에 붙이는 이름을 말한다.
식별자 이름 규칙
특수문자 ‘_’, ‘$’만 사용 가능하다.
한글을 사용할 수 있다.
숫자는 사용 가능하나, 첫 번째 문자로는 사용할 수 없다.
if, while등 자바 언어의 키워드는 사용할 수 없다.
true, false, null은 사용할 수 없다.
대소문자를 구별한다.
길이 제한이 없다.
Java 10부터는 var 키워드를 사용하여 변수의 타입을 생략하고 간단히 변수를 선언할 수 있다.
컴파일러는 var 키워드로 선언된 문장을 추론하여 변수의 타입을 자동으로 결정한다.
var price = 200; // price는 int 타입으로 결정
var name = "junyong"; // name은 String 타입으로 결정
var pi = 3.14; // pi는 double 타입으로 결정
var point = new Point(); // point는 Point 타입으로 결정
var v = new Vertor<Integer>(); // v는 Vector<integer> 타입으로 결정
var 키워드는 지역 변수에만 한정되며, 초기값이 주어지지 않으면 오류가 발생한다.
public class Var {
public static void main(String[] args) {
var price = 200; // int 타입
var name = "junyong"; // String 타입
var pi = 3.14; // double 타입
System.out.println("price = " + (price + 1000));
System.out.println("name = " + name);
System.out.println("pi = " + pi * 10);
}
}
결과: price = 1200 // name = junyong // pi = 31.4
키보드에서 입력된 키를 문자나, 정수, 실수, 문자열등 사용자가 원하는 타입으로 변환해주는 고수준(high-level) 스트림 클래스 Scanner를 사용할 것을 권한다.
Scanner는 키 입력을 위한 목적으로 자바 패키지에서 제공하는 클래스이다.
Scanner scanner = new Scanner(System.in);
Scanner 클래스는 사용자가 입력하는 키 값을 공백으로 구분되는 토큰 단위로 읽는다.
Scanner를 사용하기 위해서는 프로그램의 맨 앞줄에 다음 import 문이 필요하다.
import java.util.Scanner;
import문은 Scanner 클래스의 결로명이 java.util.Scanner임을 알려준다.
Scanner 스트림 닫기 : Scanner의 사용을 종료하려면 다음과 같이 닫아 준다.
scanner.close();
import java.util.Scanner;
public class ScannerEx {
public static void main(String args[]) {
System.out.println("이름, 도시, 나이, 체중, 독신 여부를 빈칸으로 분리하여 입력하세요");
Scanner scanner = new Scanner(System.in);
String name = scanner.next(); // 문자열 토큰 읽기
System.out.println("당신의 이름은 " + name + "입니다.");
String city = scanner.next(); // 문자열 토큰 읽기
System.out.println("당신이 사는 도시는 " + city + "입니다.");
int age = scanner.nextInt(); // 정수 토큰 읽기
System.out.println("당신의 나이는 " + age + "살입니다. ");
double weight = scanner.nextDouble(); // 실수 토큰 읽기
System.out.println("당신의 체중은 " + weight + "kg입니다. ");
boolean single = scanner.nextBoolean(); // 논리 토큰 읽기
System.out.println("당신의 독신 여부는 " + single + "입니다. ");
scanner.close(); // scanner 스트림 닫기
}
}