본문 바로가기

자바

자바 2주차<자바의 구성과 객체지향프로그래밍의 동작>

2021년 7월 작성 글

데이터 타입

기본 데이터 타입

-Boolean : 논리자료형. 참과 거짓을 나타내며 참은 1, 거짓은 0에 대응된다.

-Numeric : 정수 또는 소수 값을 저장하는 자료형

->Integer : 클래스 타입 자료형. null값 처리가 가능. 정수형 변수

=>byte : 1byte크기의 정수형 타입

=>char : 문자 하나만 저장 가능한 자료형

=>short : 2byte크기의 정수형 타입

=>int : 32byte 크기(null값 저장 불가)의 정수형 타입

=>long : 16byte크기의 정수형 타입

->Floating : 실수형 변수

=>float : 소수 6자리까지 정확하게 표현 가능

=>double : 소수 15자리까지 정확하게 표현 가능

 

Reference type

-Class : 객체를 정의하는 틀 또는 설계도 같은 의미로 사용됨. class를 사용해 여러 객체를 만들 수 있음. 객체의 상태를 나타내는 필드와(클레스에 포함된 변수) 객체의 행동을 나타내는 메소드로 구성됨. (특정 작업을 수행하기 위한 명령문의 집합)

-Interface : 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 역할을 하는 것. 자바의 다향성을 극대화해 개발코드 수정을 줄이고 프로그램 유지보수성을 높임. 코드가 반드시 지켜야 하는 가이드라인 같은 개념. interface 키워드를 통해 선언할 수 있고 implements키워드를 통해 일반 클래스에서 인터페이스 구현이 가능함

-Array(Matrix) : array는 배열을 의미함. 배열이란 동일한 자료형으로 구성된 연속된 자료의 집합임. 자바의 배열은 힙 메모리를 할당받음. 0부터 시작됨. 1차원 배열은 1열로 된 저장공간임. 2차원 배열은 matrix(행렬)을 생각하면 됨. 2 이상의 행과 1이상의 열로 구성된 배열을 2차원 배열이라고 함

 

Reference type

객체지향의 핵심 개념.

힙 공간을 new로 생성하고 그 공간을 지칭하는 것을 reference라고 한다.

힙 영역은 동적할당을 지원함.

클래스 객체의 생성이나 배열과 같은 행렬의 공간을 만드는데 사용됨.

힙 영역은 메인 메모리 세그먼트의 영역임. 원래는 메인 메모리에 공간 덩어리가 생길 때 이것들을 크기별로 정렬하는 알고리즘 이름이 힙. 하지만 포괄적으로 동적 메모리 관리영역을 힙 영역이라고 함.

new를 사용하면 힙 영역에 객체들이 생성되고 스택영역에 생성된 멤버필드들이 힙 영역의 주소를 가리켜서 값을 참조함.

 

코드의 실행에 따른 영역별 실체화 순서

 

MyClass라는 클래스가 있음.

스택 세그먼트에 my 의 멤버필드 공간이 생성됨.

(마이 클래스 내의 멤버 필드는 name, type 변수가 있고, 클래스 내 action이라는 메서드가 존재)

 

코드의 다른 곳에서 Myclass my = new MyClass() 즉 생성자로 my라는 이름의 MyClass객체를 생성함. => 힙 영역에 MyClass의 멤버필드와 메서드가 생성됨. 이를 인스턴스 되었다 라고 표현함(메인 메모리 공간을 할당받아서 실체화 되었다)

 

스택 영역 내의 my라는 공간은 힙 영역의 주소를 담고 있음.

 

my공간이 가지고 있는 주소를 따라가면 MyClass의 멤버필드 값과 메서드의 주소값이 연결됨.

 

메서드의 주소값을 따라가면 코드 세그먼트(실제 실행코드가 들어가는 영역)에 실제 함수가 있음. my.action() 의 코드로 함수를 호출할 때 실행됨.

 

reference type을 잘 알아야 하는 이유

oop 실행 상 핵심은 class에 대한 instance의 생성. object를 class에 대한 instance라고도 부른다.

object oriented(객체지향)를 실행시키면 멤버필드를 참고하여 클래스 내 정의된 메소드를 실행한다.

 

자바 메인의 arg[] 값 주는 법

cmd창에 java 파일명 값1 값2 값3 을 입력하면 값1이 arg[0] 값2이 arg[1] 값3이 arg[2] 로 들어감!

 

for(i=0; i<args.length; i++) 과 for(string name : args) 는 같은 뜻임. 전자는 우리가 알고있는 기본 for문에 비교값을 배열의 개수를 구하는 메서드를 사용한 것이고 후자는 배열의 값을 하나씩 name이라는 변수에 받아서 for문을 돌린 것.

 

try-catch-finally

-예외적인 처리를 위해 사용.(미확정 오류 사례 등) 사소한 오류가 발생했을 때 예외처리를 안하면 바로 종료 되어버림. 예외처를 시켜주면 예외 코드 실행 후 다음 단계로 넘어감.

-같은 기능을 n번 수행시키기 위해 사용(소프트웨어 신뢰성을 위해 사용)

try{ 예외검사할 코드 }

catch(잡아낼 예외){ 예외 검사 코드에서 예외가 걸리면 실행할 코드 }

finally{ 예외가 발생하던 안하던 실행할 코드. 정리의 역할로 사용됨. 필수는 아님! 위 두개만 필수 }

 

method calling (함수 호출)

메서드는 코드들의 집합을 가지고 있는 함수임.

반복해서 객체를 실체화 시키는 데에 호출됨.

 

method invocation

객체에서 호출된 메서드를 실행시킴

원격 메서드를 호출함.(디바이스와 디바이스, 컴퓨터와 컴퓨터를 연동시킴. 원격 호출이 가능함. 자바 RMI)

ECA(Event Condition Action) 규칙을 따름

파이썬의 데피니션과 c의 펑션과 같은 개념

어떤 코드에서 new를 통해 객체가 생성되고 객체명.메서드명()으로 메서드가 호출될 때 이 호출을 이벤트라고 함. 그리고 함수를 호출하는 과정을 method invocation이라고 하고 call function이라고도 함. 이 부분에서 컨디션 체크가 들어감. 그리고 호출된 함수를 실제로 실행하는게 액션임.

총괄적으로 메시지 패싱 기반의 메소드 임보케이션이라고함. 오버라이딩 개념이 포함된 것. 메시지 패싱에 의해 실행되는게 메시지 임보케이션.

 

시그니쳐

이벤트 발생 시 생성되어 컨디션으로 넘어가는 것. 함수의 이름, 변수의 수, 변수의 타입등을 지칭함. 컨디션은 이 정보를 받아서 액션됨.

 

자바 RMI란?

분산되어 존재하는 객체간의 메시지 전송(메소드 호출 포함)을 가능하게 하는 프로토콜을 의미함.

네트워크 상에 있는 원격 컴퓨터 객체의 메서드를 호출하는 java 분산처리 방법. (네트워크에 연결되어있는 다른 컴퓨터 내의 메소드를 내 컴퓨터에 있는 것처럼 호출해서 사용 가능하게 해주는 것이 java.rmi.package임)

상위레벨에서 분산객체 간 데이터 전송을 메소드를 부르는 것과 같은 방법으로 구현하기 때문에 훨씬 구현이 쉬움. 또한 상위레벨에서 수행되기 때문에 신뢰성이 보장되고 자바 자체에서 라이브러리를 제공해줌. java.rmi 안에 rmi system의 상태를 나타내는 인터페이스 들과 클래스들이 정의되어 있음

 

ECA란?

JVM에서 메서드를 호출하면 연동되는 부분.

Event는 함수 호출을, Condition은 어떤 함수를 호출했는지. 오버라이딩 등 개념 적용되는 부분. 여러 함수 중 어떤 함수를 체크해주는가?에 대한 내용을, Action은 실제 코드 수행을 담당함.

프로그램이 실행되는 가장 중요한 원리임. call자체가 이벤트이고 객체지향에서 그대로 적용해서 시행이 됨.

 

call by value

메서드 호출에 대해 매개변수의 값을 전달하는 걸 call by value라고 함.

밑에서 추가 정리

call by reference 방식으로 호출한 메서드

객체의 주소값을 참조하는 방식.

꼭 힙 영역 안의 객체 클래스를 체크해야함.

참조 내용을 사용하고 해당 내용을 업데이트 함

 

 

콜바이벨류의 경우 a 메서드에서 변수에 100이라는 값을 주면 스택 영역에 a 메서드와 변수 값 100이 생겼다가 메서드가 리턴되면 100이라는 값은 소멸해버림. int 같은 타입을 아규먼트로 넘김

콜바이레퍼런스의 경우 100이라는 값을 가진 변수가 스택에 생기는 대신 100값을 가진 힙 영역을 연결하는 주소를 담은 변수가 스택에 생김. 리턴 시 주소값만 스택에서 소멸되고 실제로 100이라는 값은 힙 영역에 그대로 남아있음. 자바가 사용하는 방식. class 타입 자체를 아규먼트로 넘김.

 

OOP(객체지향 프로그래밍)이란?

기본원리는 객체라고 불리는 소프트웨어 컴퍼런트를 만드는 것. (코딩에서 생성하는 요소를 전부 각 오브젝트로 만들어라!)

객체에 서비스를 제공할 데이터와 메서드가 포함되어 있음.

컴퍼런트(클래스)=오브젝트=할 일이 필요한 데이터와 메소드를 정리한 것

서비스란 기능, 행위, 할 일등을 의미함.

OOP는 객체 인스턴스에 기반해서 실행됨.

 

인스턴스란?

실제 세상을 추상화 한 것을 정의하고 생성한 것. 그리고 서비스를 위한 데이터와 메서드를 포함함.

 

자바는 객체지향 언어임

클래스를 사용하여 객체를 정의하고(.java파일 생성. 오브젝트를 정의하는 것) new생성잘르 사용해 객체 인스턴스를 생성함(오브젝트 인스턴스를 생성 시키는 것.)

 

클래스란?

현실의 개념을 추상화하고 대표하는 것.

클래스 객체를 개발자가 프로그램에 정의함

프로그램을 실행하기 위해서 클래스에서 개체가 동적으로 생성됨.

 

오브젝트란?

객체를 의미하며 클래스에 대한 메모리 공간을 가진 인스턴스임.

 

oop 단계

1. 현실 세계를 추상화하고

2. 클래스를 정의하고

3. 클래스 객체 인스턴스를 생성하고

4. 클래스 객체를 실행함.

 

class Car라는게 있으면 객체는 자동차 개념을 클래스로 실현한 것임.

한가지 class로 여러 objects를 생성할 수 있다.

 

 

 

용어정리 :

instance란?

object에 포함된 의미. 클래스로부터 new명령문을 통해 메모리에 생성한 객체를 그 클래스의 인스턴스라고 함. class라는 설계도를 통해 독립적인 객체를 만든 것. 클래스로부터 new 생성자로 객체를 만드는 과정을 클래스의 인스턴스화 라고 함.

(메인 메모리 공간을 할당받아서 실체화 되었다)

구체적인 상태(변수)와 행위(기능)의 집합

heap이란?

모든 자바 클래스의 인스턴스와 배열이 할당 되는 곳으로 참조타입들을 힙 영역에 주소 형식으로 저장한다. 힙 영역은 JVM이 시작될 때 생성됨. 힙 영역의 크기는 가비지 컬렉션에 따라 고정된 크기일 수도 유동적인 크기일 수도 있음.

물리적으로 두 부분으로 나뉘어짐.

nursery파트 – 새로운 객체 할당을 위해 힙에 할당된 공간. 이 부분이 가득차면 young collection(nursery에 오래 머문 모든 객체를 old space로 이동시켜 더 많은 객체를 할당 받을 수 있게 해줌)이라는 것을 실행해 쓰레기를 수집한다.

old space – 어느 정도 시간이 지난 객체들이 모여있는 곳.

흔히 코드에서 new 명령을 통해 생성된 인스턴스 변수나 배열이 보관된다. 힙 영역 보관 메모리는 메소드 호출이 끝나도 가비지가 되어 지워질때까지 혹은 JVM이 종료될 때까지 사라지지 않는다.

인스턴스를 별도의 힙 영역에 할당하는 이유는 인스턴스의 소멸방법과 소멸시점이 지역변수(스택영역 할당 변수)와는 달라서이다.

8가지 원시타입(byte, short, int, long, float, char, Boolean)을 제외한 타입으로 정의된 변수는 전부 레퍼런스 변수이다. 이런 참조변수들을 실행 할때마다 스택 메모리 영역에 넣었다가 삭제했다가 한다면 매우 비효율적인 방식이 되므로 힙 영역에 그 변수의 진짜 값을 저장하고 스택 메모리에는 간단하게 힙 영역에 저장된 진짜 값의 주소만 저장하는 것이다.

사용자가 직접 관리할 수 있는 영역(변수를 할당하고 해제하는 책임이 있음) 사용자에 의해 메모리 공간이 동적을 할당되고 해제됨. 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됨. 상대적으로 엑세스가 느리고 효율적으로 공간을 사용하지 못하면 메모리 블록이 할당 된 후 시간이 지남에 따라 메모리가 조각화되어 해제될 수 있음.

stack이란?

자료를 하나 다음 하나 라는 컨셉으로 순차적으로 저장하는 직선형 자료구조이다. 스택에서 자료를 추출하고 삽입할 때 맨 끝에만 접근이 가능하다. 새로운 데이터는 스택의 최상위에 위치하게 되고 데이터 추출시에는 가장 최근에 삽입된 최상위 데이터만 접근이 가능한 것. 즉 Last In First Out. LIFO구조를 가지고 있다. 재귀적인 호출을 사용할 때 특히 유용하게 쓰인다.

새 메소드가 호출 될 때마다 새로운 프레임이 스택에 삽입되고 메소드가 끝날 때마다 스택에서 제거된다.

스택 영역은 기본타입인 정수형 변수, 실수형 변수, 논리형 변수를 실제값으로 저장한다.

해제하지 않음으로써 메모리 누수가 생기는 등의 문제에 대해 신경쓰지 않아도 된다. 힙 메모리에 비헤 엑세스 속도가 빠르다. 공간이 CPU에 의해 효율적으로 관리되고 메모리 단편화가 발생하지 않는다. 그러나 지역변수만 저장 가능하고 메모리 크기가 하드 코딩 되어있어 추후 조절이 불가능하다. 동적 할당에 비해 할당 받을 수 있는 최대 메모리에 제약을 받는다. 메모리 할당 시 컴파일할 때 할당 크기가 이미 계산된다.

segment란?

프로그램은 주기억장치를 효율적으로 운영하기 위해서 일정한 크기를 논리적 단위로 나누어 할당과 할당해제로 관리하는데 그 논리적 단위를 세그먼트라고 함.

즉 프로그램에 정의된 특정 영역임. 프로그램 실행을 위해 필요한 공간과 데이터를 처리하는 명령어들을 위한 프로그램이나 메모리의 부분. 나누어진 세그먼트 별로 프로세스에게 할당하고 다른 세그먼트의 접근을 막는 방식으로 메모리를 보호함. 세그먼트는 서로 크기가 다르므로 메모리를 미리 분할 할 수 없고 메모리를 참조할 때 위치 파악을 위헤 세그먼트 번호와 오프셋을 기준으로 데이터를 다룸. 코드 세그먼트, 데이터 세그먼트, 스택 세그먼트, 힙 세그먼트가 있다.

수행중인 프로그램이 메모리 상에 이상한 주소를 접근하려고 할 때 세그먼테이션 폴트가 발생한다.

세그먼테이션이란 메모리를 가변 길이로 나누어 관리하는 것.

-코드 세그먼트 : 실행될 기계 명령어를 포함한다. 첫번째로 실행 가능한 명령어는 이 세그먼트의 맨 처음에 보통 위치한다.

-데이터 세그먼트 : 프로그램에서 정의된 데이터, 상수, 작업 영역을 포함한다.

-스택 세그먼트 : 프로그램이 임시로 저장할 필요가 있는 데이터와 주소를 포함한다.

method invocation이란?

참조 변수의 클래스에 정의된 메서드를 호출함. 사용자 클래스, 시스템 클래스 및 외부 클래스의 메서드에 사용됨.

다른 클래스의 특정 메서드를 실행 시키고 싶을 때 사용됨.

ECA란?

Event condition action.

특정 조건이 존재하는 경우 이벤트로 인해 동작이 시작되는 이벤트 기반 컴퓨팅 기초 방법.

데이터베이스에서 발생하는 다양한 종류의 이벤트에 반응할 필요성 때문에 개발됨.

이벤트 발생시 조건 검사 후 지정한 작업을 실행하는 구조.

시스템의 이벤트 기반 프로그램에서 중요한 이벤트가 식별됨.

이벤트 : 이벤트 부분은 호출을 시작하는 신호를 지정함.

이벤트는 센서 데이터 전송, 타 프로그램이나 시스템의 메시지 등 일 수 있음. 여러 이벤트 유형의 구성일 수도 있음. 이를 복합 이벤트라고 함.

컨디션: 지정된 조치를 수행하기 위해 충족해야 하는 조건들로 이루어짐.

이벤트가 발생하면 컨디션 부분이 조건을 확인 후 충족 시 작업을 수행함.

지정된 이벤트가 발생한 경우에만 확인됨.

액션 :

데이터에 대해 수행할 작업을 지정.

작업은 로컬데이터에 대한 업데이트나 호출로 이루어짐.

 

call-by-value란?

함수 호출 시 전달되는 변수의 값을 복사해서 함수의 인자로 전달함.

복사된 인자는 함수 안에서 지역적으로 사용되는 로컬변수의 특성을 가지기 때문에 함수 안에서 인자의 값이 변경되어도 이미 전달된 외부 변수의 값은 변경되지 않음.

예를 들어 메인 함수에서 int n을 선언 후 값으로 10을 주고 b라는 함수 호출 시 n을 콜바이벨류를 사용해 인자로 넘김. 이때 b함수는 메인 함수에게 받은 n의 값만 가지고 메모리에 새로운 임시 공간을 만들어 저장함. b함수에서 n의 값이 수정이 되어도 메인함수의n가 저장된 메모리와 b함수의 n메모리가 다르므로 직접적인 연관이 없음. 또한 b함수가 종료되면 b함수의 변수n도 소멸하게 됨.

 

call-by-reference란?

함수 호출 시 인자로 전달되는 변수의 레퍼런스(주소)를 전달하여 해당 변수를 가리키게 함. 따라서 함수 내에서 인자의 값이 변경될 경우 전달된 객체의 값도 함께 변경됨.

예를들어 메인함수에서 변수n을 선언 후 10이라는 값을 주면 메모리 상에 변수 n구역이 정해지고 10이 입력된다. 그리고 함수b를 호출할 때 콜바이레퍼런스를 사용해 인자로써 n변수의 주소값을 준다. 변수 n을 위한 별도의 임시 공간이 생성된다. 이것은 함수b의 변수 n의 공간이므로 함수 b가 종료시 사라진다. 그 안에 메인함수의 변수 n주소값이 들어가게 된다. 고로 메인함수의 n과 함수 b의 변수 n은 같은 변수가 되고, 함수 b에서 n값을 바꾸면 메인함수의 n값도 변경되게 된다.

 

activation record란?(프로그래밍 동작원리-스택 활용 등)

운영체제가 메인 함수를 호출하는 순간 메인 함수의 활성화 레코드가 생성된다. 활성화레코드는 스택에 저장되는 것으로 스택 프레임이라고도 한다.

메인 메모리를 단순화 시키면 위에서 아래 순으로 힙-미 사용공간-스택-전역변수-기계어 코드 로 구성되어 있는데, 스택 메모리는 함수 호출시에 정적으로 할당되며 위로 자리를 늘려간다. 힙 메모리는 아래로 자라기 때문에 그 사이의 가용 메모리는 점차 줄어들게 된다.

이 스택 공간이 미사용공간을 활성화 시킨 활성화 레코드라고 볼 수 있다.

컨텍스트 스위칭을 하기 전에 함수 상태를 기록하고 복원하기 위한 것으로써 해당 함수의 리턴 값, 값 파라미터, 지역변수, 귀환 주소 등의 정보가 기록된다.

-반환값 : 피 호출 함수가 호출 함수에게 반환하는 값

-값 파라미터 : 호출 함수가 피 호출 함수에게 넘기고자 하는 값

-반환 주소 : 함수가 호출된 곳의 다음 주소. 운영체제 프로그램의 번지수 200번지에 있는 명령문에서 메인 함수를 불렀다면 메인함수 수행이 끝난 다음에는 다시 운영체제 프로그램의 바로 다음 명령문을 수행해야 하기 때문에 함수를 부른 명령문+명령문의 단위 길이 의 값을 기록한다.

-지역변수 : 함수 내에서 선언된 지역변수를 저장하는 곳.

 

로컬변수(지역변수)란?

어떤 특정 지역에서만 쓰이는 변수를 의미. 자바에서는 메소드 안에서만 쓰이는 변수를 지역변수라고 함. 메소드 내에서 만들어지고 메소드 내에서만 사용됨. 따라서 메소드 호출시 생성되고 메소드가 끝나면 소멸됨. 메소드에서 쓰이는 매개변수도 메소드 내에서만 쓰이니까 지역변수에 해당함.

 

전역변수

어디서나 쓸 수 있는 변수를 의미. 자바에서는 클래스 내에서 사용 가능한 변수를 의미함. 따라서 메소드 내에서도 사용 가능.

 

CBD란?

Component based development방법론.

잘 만들어진 컴포넌트를 재 사용이 가능한 수준으로 확보하고 그것들을 조립해서 개발 생산성을 높이기 위한 방법론. 재사용성, 유지보수성을 높이자는 차원.

컴포넌트란 함수들이 집합인 모듈들을 주제를 기반으로 모아둔 것을 칭한다.

컴포넌트 개발 방법론의 취지는 주제별로 독립적으로 개발을 하고 서로 다른 컴포넌트 간 상관관계를 줄이자는 것이다. 컴포넌트 간에 연관이 없을 수는 없지만 한 모듈을 수정했을 때 다른 연관 모듈에 영향을 미칠 확률을 줄일 수 있도록 연관관계를 줄이자는 의미이다. 그럼으로써 컴포넌트가 다른 곳에서도 사용이 용이하게끔 하는 것이다.

JAVA언어로 구현된 서버 컴포넌트 표준 기술은 SUN의 EJB가 있다.

개발 절차는 도메인 분석->도메인 설계->컴포넌트 추출->컴포넌트 설계->컴포넌트 구현->컴포넌트 인증->컴포넌트 디자인 패턴->컴포넌트 배포->컴포넌트 조립 순이다.