CS
프로그래밍 언어
토리쟁이
2023. 11. 24. 22:19
- 프로그래밍 언어
- 컴퓨터가 실행할 프로그램을 작성하는 언어
- CPU는 이진수(0, 1)밖에 이해할 수 없음
- 기계어: 이진수 명령어들로 구성된 언어
- 어셈블리어: 기계어의 각 명령을 상징적인 니모닉 기호로 일대일 대응시킨 언어
- 기계어, 어셈블리어 모두 컴퓨터가 이해하기 쉬운 저급언어임
- 고급 언어: 사람이 이해하기 쉽고 자료를 효율적으로 표현 가능한 언어
- 절차 지향 언어(C) → 객체 지향 언어(C++, java, C#..)로 진화되어 왔음
- 컴퓨터는 고급 언어로 작성된 프로그램은 직접 처리할 수 없기 때문에, 컴파일 과정이 필요함
- 컴파일: 고급 언어 → 기계어 코드 (by 컴파일러)
- 각 언어마다 전용 컴파일러 존재
- 자바
- 객체 지향 언어 → 아래에서 객체지향과 절차지향 프로그래밍의 차이점에 대해 공부할 예정
- 객체(상태+행위)로 만들고, 객체들 간의 상호 관계로 모델링하여 로직을 구성함
- 캡슐화, 상속성, 다형성 등 지원
- 플랫폼 독립성 WORA: 운영체제나 하드웨어에 상관없이 자바 가상 기계(JVM)가 있으면 어디서나 자바로 작성된 프로그램에 동일한 실행 환경을 제공하며, 동일한 실행 결과를 기대할 수 O
- WORA(Write Once Run Anywhere)
- 바이트 코드: JVM에서만 실행되는 기계어, 바이너리 코드.
- 자바 컴파일러: 자바 소스 컴파일 → 바이트 코드(클래스 파일) → 이 파일을 JVM이 인터프리터 방식으로 실행시킴
- 자바 가상 기계(JVM): 서로 다른 플랫폼에서 자바 프로그램이 실행되는 동일한 환경 제공
- 단, JVM은 플랫폼 종속적 (하지만, 다 똑같이 실행됨)
- JDK: 자바 개발자를 위한 상업용 SW/ 개발 도구 + JRE
- JRE: 자바 API(이미 컴파일된 다양한 클래스 라이브러리) + JVM(자바 가상 기계)
- 개발자가 아닌 일반 사용자들의 경우, JRE만 필요함
- 클래스로 캡슐화: 변수 or 메소드 → 반드시 클래스 내에 구현-
- 클래스 파일에는 반드시 하나의 자바 클래스만 들어 있음
- 멀티스레드: 하나의 자바 프로그램이 다수의 작업을 처리할 수 있도록 다수의 스레드가 동시에 실행할 수 있는 환경을 지원함
- 가비지 컬렉션: 사용되지 않는 메모리는 JVM의 가비지 컬렉션 기능에 의해 자동으로 회수됨
- 실시간 응용 시스템이 부적합
- 실행 도중, 예측할 수 없는 시점에 가비지 컬렉션이 실행되어 프로그램의 실행이 일시적으로 중단됨
- 안전함
- 프로그램 작성이 쉬움
- 실행 속도를 개선하기 위해 JIT 컴파일러가 사용됨
- JVM이 인터프리터 방식으로 바이트 코드를 실행하므로 비교적 느리다고 알려져 있지만, 최근에는 실행 도중 자바 프로그램을 해당 CPU의 기계어 코드로 컴파일하고 CPU가 바로 기계어를 실행하도록 하는 컴파일링 기법을 이용
- 객체 지향 언어 → 아래에서 객체지향과 절차지향 프로그래밍의 차이점에 대해 공부할 예정
※ 절차지향 프로그래밍 vs 객체지향 프로그래밍※
- 절차지향 프로그래밍
- 순차적인 처리가 중요시 되며, 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법
- 객체지향에 비해 비교적 빠른 속도를 갖음
- 유지보수가 어려움
- 실행 순서가 정해져 있기 때문에, 코드의 순서가 변경되면 동일한 결과를 보장하기 어려움
- 디버깅이 어려움
- ex) C
- 객체지향 프로그래밍
- 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체로 만들고, 객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 기법
- 객체: 프로그램에서 사용되는 데이터 or 식별자에 의해 참조되는 공간/ 변수와 메소드를 서로 연관된 것들끼리 묶어서 만든 것/ 상태+행위
- ex) C++, C#, Java Python, JavaScript, Ruby, Swift..
- 특징: 추상화, 캡슐화, 상속성, 다형성
- 추상화: 객체에서 공통된 속성과 행위를 추출하는 것/ 불필요한 정보는 숨기고 중요한 정보만 표현
- 캡슐화: 변수와 함수를 하나로 묶는 것/ 낮은 결합도를 유지할 수 있도록 설계하는 것/ 정보은닉 가능
- 상속: 클래스의 속성과 행위를 하위 클래스에 물려주거나 하위 클래스가 상위 클래스의 속성과 행위를 물려받는 것/ 새로운 클래스가 기존 클래스의 데이터와 연산을 이용할 수 있게 하는 기능
- 재사용 → 코드 감소
- 범용적인 사용 가능
- 자료와 메서드의 자유로운 사용 및 추가 가능
- 상위 클래스의 변경이 어려워짐 (단점)
- 불필요한 클래스가 증가할 수 O (단점)
- 상속이 잘못 사용될 수 O (단점)
- 다형성: 하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석될 수 있는 것/ 어떠한 요소에 여러 개념을 넣는 것
- 오버라이딩: 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용하는 것
- 오버로딩: 같은 이름의 메서드가 인자의 개수나 자료형에 따라 다른 기능을 하는 것
- 장점
- 클래스 단위로 모듈화시켜서 개발하기 때문에 업무 분담이 편리하고 대규모 개발에 적합함
- 유지보수 용이
- 코드 재사용 용이
- 단점
- 처리속도가 비교적 느림
- 객체의 수가 늘어남에 따라 용량이 증가할 수 O
- 설계시 많은 시간과 노력이 필요
- 객체 지향 설계 원칙 SOLID
- 단일 책임 원칙: 하나의 클래스는 단 하나의 책임만 가져야 한다.
- 개방-폐쇄 원칙: 확장에는 열려 있으나, 변경에는 닫혀 있어야 한다.
- 리스코프 치환 원칙: 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 함-
- 인터페이스 분리 원칙: 범용 인터페이스 하나보다 클라이언트를 위한 여러 개의 인터페이스로 구성하는 것이 좋다.
- 의존관계 역전 원칙: 추상화에 의존할 것(구체화XXX)