CS
-
CS) DOM2023.02.08
-
CS) HTML,XML2023.02.08
-
CS) 객체지향(OOP)2023.02.08
-
CS) Virtual Memory2023.02.08
-
CS) Byte padding2023.02.08
-
CS) 프로세스 메모리 구조2023.02.08
CS) DOM
DOM이란?
- DOM이란 Document Object Model의 약자로 웹 페이지에 대한 인터페이스이다(HTML과 XML 문서의 프로그래밍 Interface).
- DOM은 Tree 형식의 자료구조이다.
- DOM을 사용하여 단순 텍스트로 구성된 HTML 문서의 내용과 구조가 객체 모델로 변환되어 다양한 프로그램에서 사용될수있다.
- 웹 페이지를 스크립트 또는 프로그래밍 언어들에서 사용될수 있게 연결시켜주는 역활을 담당한다 -> 즉 DOM을 통해 스크립트가 문서내의 모든 요소에 동적으로 접근이 가능하도록 한다.
- 여기서 문서내의 모든 요소에 동적으로 접근이 가능하다 라는 말은 -> 동적으로 문서의 객체를 생성할수 있다는 말이다.
ex) JS를 통해 HTML에 없던 객체를 생성할수 있다.
DOM의 생성
- DOM의 개체 구조는 노드 트리로 표현이 되며, HTML을 노드 트리로 표현하면 아래와 같이 된다.
Reference
- (번역) DOM은 정확히 무엇일까?
https://wit.nts-corp.com/2019/02/14/5522
'CS' 카테고리의 다른 글
CS) Mutable,Immutable (0) | 2023.02.08 |
---|---|
CS) Tokenizer,Lexer,Parser (0) | 2023.02.08 |
CS) HTML,XML (0) | 2023.02.08 |
CS) 객체지향(OOP) (0) | 2023.02.08 |
CS) Virtual Memory (0) | 2023.02.08 |
CS) HTML,XML
마크업(MarkUp)이란?
- 마크업이란 문서 처리를 지원하기위해 문서에 추가되는 정보를 의미한다.
- 마크업 언어는 태그 등을 이용하여 문서나 데이터의 구조를 명기하는 언어의 한 가지이다.
- 다양한 마크업 언어중 HTML 과 XML의 특징및 차이점을 알아본다.
HTML이란
- HTML은 Hypertext MarkUp Language의 약자이며, 웹 페이지 및 웹 응용 프로그램의 구조를 만들기 위한 표준 마크업 언어이다.
- 웹 페이지 및 웹 응용 프로그램의 구조를 만들기위한 표준 마크업 언어이다.
HTML의 특징
- 구조가 단순하며 문법이 쉽다.
- HTML은 다른 프로그래밍 언어에 비해 단순한 구조를 가지고, 논리적이고 연산적인 요소가 없다.
- 플랫폼에 독립적이다
- HTML 문서는 운영체제에 상관없이 웹 브라우저만 있으면 표시할수 있다.(웹 브라우저는 HTML 표준에 기준을 두고 제작된다.)
- HTML의 요소는 태그로 표현된다
- HTML의 태그는 쌍으로 존재하며, 아래 코드와 같이 작성한다.
<태그이름>문자</닫는태그>
- 모든 태그가
</닫는태그>
를 갖는것은 아니다.<br>, <meta>
와 같이 시작태그와 닫는 태그 사이에 적용할 대상없는 단일 태그도 존재한다.
XML이란
- XML은 Extensible Markup Language의 약자이며, 문서를 인코딩하기위한 규칙 집합을 정의하는 마크업 언어이다.
- XML은 인터넷 웹페이지를 만드는 HTML을 획기적으로 개선하여 만든 언어이다.
- XML은 HTML처럼 데이터를 보여주는 목적이 아닌, 데이터를 저장하고 전달할 목적으로만 만들어졌다.
XML과 HTML의 차이
- 태그의 종류
- HTML은 태그의 종류가 한정되어 있지만
XML은 문서 내용과 관련된 태그를 사용자가 직접 정의할수 있다. (이 이유는 XML은 다른 언어를 기술하기위한메타언어
이기 때문이다)
- HTML은 태그의 종류가 한정되어 있지만
- 사용 목적
- 앞서 말했듯 HTML은 웹 페이지 구조를 개발하는데 목적이있고,
XML은 정보를 전달하는데 목적이 있다.
- 앞서 말했듯 HTML은 웹 페이지 구조를 개발하는데 목적이있고,
Reference
'CS' 카테고리의 다른 글
CS) Tokenizer,Lexer,Parser (0) | 2023.02.08 |
---|---|
CS) DOM (0) | 2023.02.08 |
CS) 객체지향(OOP) (0) | 2023.02.08 |
CS) Virtual Memory (0) | 2023.02.08 |
CS) Byte padding (0) | 2023.02.08 |
CS) 객체지향(OOP)
객체지향이란
- 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만든후 그 객체들간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
- 장점
- 코드 재사용성이 높다
- 상속 등을 통하여 기존의 코드를 재사용할수 있다.
- 코드 관리가 용이하다
- 코드 간의 관계를 이용해 적은 노력으로 쉽게 코드변경이 가능하다.
- 신뢰성이 높은 프로그래밍을 가능하게 한다.
- 코드의 중복제거, 제어자와 메서드를 이용해 데이터를 보호 및 올바른 값을 유지하도록하여 오동작을 방지할수 있다.
- 코드 재사용성이 높다
용어
- 클래스
- 클래스란 객체를 정의해 놓은것, 즉 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성된다.
- 객체
- 프로그래밍에서 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.
- 인스턴스화
- 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화 라고한다.
- 인스턴스
- 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스 라고한다.
- 콜렉션(Collection)
- 인스턴스 여러개의 모임
프로그래밍 구조
속성과 기능
- 클래스란 객체를 정의한 것이다 따라서 클래스에는 객체의 모든 속성, 기능이 정의되어 있다.
- 객체지향에서는 속성을 멤버변수를 통해 기능은 메서드를 통해 표현한다.
캡슐화
- 캡슐화란 클래스의 내부 변수와 메소드를 하나로 패키징 하는 특징이다.
- 객체에 선언된 변수 또는 메소드가 어떠한 제한없이 누구나 접근할수 있다면 정상적인 객체로 보기 힘들다 따라서 캡슐화를 사용한다.
- JAVA에서는 접근제어자를 통해 객체의 캡슐화, 은닉화를 구현한다.
상속
- 상속이란 객체가 다른 객체를 상속받아 상속받은 객체의 요소를 사용하는것을 의미한다.
- 상속을 통해 코드의 재사용성과, 확장성, 유지보수성, 최상위 클래스 구조를 통한 하위클래스의 동작을 예측할수 있다는점에서 프로그램 구조에대한 이해도 향상등.. 다양한 장점이있다.
다형성
- 다형성이란 하나의 객체 혹은 메소드가 여러 타입을 참조할수 있음을 의미한다.
즉 자식객체가 부모의 타입에 들어갈수있다. - 다형성은 크게 객체의 다형성, 메소드의 다형성으로 구분된다.
객체의 다형성
- 객체의 다형성이란 객체가 상속된 부모 객체의 인스턴스로 할당될수 있음을 의미한다.
class Account
{
// 메소드
}
class CheckingCard extends Account
{
// 메소드
}
public class Main {
public static void main(String[] args) {
Account card = new CheckingCard();
}
}
위 코드에서 CheckingCard 는 Account를 상속받았다.
이때 Account card = new Account() 로 객체를 생성하는 대신 위와같이 객체를 생성할수 있다는게 바로 다형성중 객체의 다형성이다.
메소드의 다형성
- 메소드의 다형성이란 메소드가 서로 동일한 이름을 가지더라도, 입력받는 파라미터가 다르면 각각 개별적인 메소드로 취급을 의미한다.
public class Main
{
public static void main(String[] args)
{
System.out.println("문자");
System.out.println(1234);
System.out.println(true);
}
}
- 위 코드에서 사용한 println 메소드는 입력되는 파라미터가 문자열,숫자,bool 타입으로 다 다르지만 잘 처리하는것을 볼수있는데 이러한 이유는 println메소드가 다형성을 통해 정의되어있기 때문이다..
추상화
- 추상화란 클래스 정의시 불필요한 부분을 생략하고 객체의 속성중 중요한것에만 중점을 두어 개략화 하는것을 말한다.
즉 클래스들의 중요하고 공통된 성질들을 추출하여 슈퍼 클래스를 선정하는 개념이다.
캐스팅
- 캐스팅이란 타입을 변환한다는 것이다.
캐스팅의 종류는 업 캐스팅 과 다운 캐스팅 2가지이다.
- 업 캐스팅
- 업 캐스팅이란 자식 클래스가 부모 클래스 타입으로 캐스팅이 되는것을 말한다.
class Account
{
// 메소드
}
class CheckingCard extends Account
{
// 메소드
}
public class Main {
public static void main(String[] args) {
CheckingCard child = new CheckingCard();
Account parent = child;
}
}
- 위와 같은 코드가 있을때 Account parent = child 부분이 자식클래스가 부모 클래스 타입으로 캐스팅이 된 부분이다.또한 이때 명시적인 타입캐스팅 Account parent = (Account) child; 와 같이 (Account)를 붙여줄 필요가 없다.
- 업캐스팅을 통해 수퍼클래스의 참조변수 parent가 서브클래스의 인스턴스를 가리킬수 있게 된것이다.
주의
- 업캐스팅을 하게되면 부모의 참조변수를 통해 자식의 인스턴스를 지정한다. 따라서 자식 클래스에 있는 속성과 메서드는 실행할수 없게 된다.
- 업 캐스팅후 메소드 실행시, 자식클래스에서 오버라이딩한 메서드가 있을경우, 부모 클래스의 메소드가아닌 오버라이딩한 메소드가 실행되게 된다.
업 캐스팅 사용이유
- 업케스팅을 하게되면 상속관계에서 상속받은 서브클래스의 개수에 상관없이 하나의 인스턴스로 묶어 관리가가능하다.
- 위 와 같은 코드에서 만약 Account 를 상속받은 다른 서브 클래스가 있더라도 업캐스팅을 통해 Account[] a = new Account[]; 라는 a배열을 통해 서브 클래스들을 한번에 정리하는등.. 가독성과 유지보수성을 높일수있다.
- 다운 캐스팅
- 다운 캐스팅은 업캐스팅과 반대로 부모 클래스가 자식 클래스의 타입으로 캐스팅이 되는것을 말한다.
- 주의
- 다운캐스팅은 업캐스팅과는 반대로 캐스팅 연산자를 생략할수 없다
- 다운 캐스팅 사용이유
- 다운캐스팅은 우리가 업캐스팅한 객체를 다시 자식클래스 타입의 객체로 되돌리는데 목적이 있다.
instanceof 연산자
- instanceof 연산자를 통해 어느 객체 변수가 어느 클래스 타입인지 판별해준다 (return 값은 true/false).
class Account
{
// 메소드
}
class CheckingCard extends Account
{
// 메소드
}
public class Main {
public static void main(String[] args) {
CheckingCard child = new CheckingCard();
Account parent = new Account();
System.out.println(parent instanceof CheckingCard); // false
System.out.println(parent instanceof Account); // true
System.out.println(child instanceof Account); // true
}
}
- 위 코드에서 보면 parent는 CheckingCard(자식)의 인스턴스가 아니기때문에 false가 출력된다.
- 반면 3번째 출력문에서 child는 Account(부모)의 인스턴스로도 보기때문에 false가 아닌 true가 나온다.
'CS' 카테고리의 다른 글
CS) DOM (0) | 2023.02.08 |
---|---|
CS) HTML,XML (0) | 2023.02.08 |
CS) Virtual Memory (0) | 2023.02.08 |
CS) Byte padding (0) | 2023.02.08 |
CS) 프로세스 메모리 구조 (0) | 2023.02.08 |
CS) Virtual Memory
Virtual Memory
- 가상메모리란 지금 당장 실행해야 되는 부분만을 메인 메모리에 저장하고 나머지 프로그램은 보조 기억장치에 둔채 동작을 하는 방법이다.
- 가상메모리를 사용하는 이유
우리가 1G 메모리를 사용한다 가정해보자. 이때 위사진에서 프로그램 B를 실행하는데 2G의 메모리가 필요하다고 한다면, 내컴퓨터에서 프로그램 B는 실행조차 할수없다.
이러한 상황을 해결하기위해 Virtual Memory의 개념을 사용해본다면, 프로그램 B를 시작할때 프로그램 B1만 구동하면 실행이 가능하다 라고할때 프로그램 B자체는 virtual Memory 공간에 두고 우리가 실행할때 필요한 B1만을 메인메모리로 가져와 프로그램을 실행하는것이다. - 즉 실제 프로그램이 필요로하는 메모리 용량이 크다 하더라도 우리가 필요한부분만을 실제 메인메모리에 가져와 실행을 시켜 메모리를 효율적으로 사용한다는 것이다.
Paging 기법
- 페이징 기법이란 프로그램을 일정 크기로 나누어 페이지를 만들고 페이지 단위별로 메인메오리에 올려 동작하는 방식이다.
- 페이징 기법을 통해 Virtual Memory동작이 가능하도록 한다.
- 프로그램은 페이지 단위로 나눠 관리한다.
위 사진을 예로들면 프로그램 A는 사진과같이 총 16개의 페이지로 구분이 되어있는것이다. - 페이지 테이블이란 프로그램 A를 구성하는 페이지가 메인메모리의 어디서부터 저장이 될것이냐 를 알려주는 테이블이라고 보면된다.
즉 위사진에서 페이지 0번은 페이지 테이블에 의하여 메모리의 1000번 주소부터 저장이 되는것이고 페이지 2번은 페이지 테이블에 의하여 메모리 2000번부터 저장이 되는것이다. - 여기서 굳이굳이 페이지 테이블을 사용하는 이유는 메인메모리에 저장되는 페이지들은 물리적으론 떨어져 있더라도 논리적으론 붙어있어야한다. 이말이 무슨말이냐면 만약 메인메모리에 프레임 0, 프레임 1, 프레임 2 가 위 사진에선 붙어있지만 만약 떨어져있더라도(물리적으로) 페이지 테이블에 각 페이지가 메인메모리에 저장되는 시작주소가 적혀있기때문에 논리적으론 페이지들이 이어져 있다고 생각할수 있는것이다.
주소공간
- 32bit 컴퓨터를 사용한다면 메인메모리는 4G까지만 사용할수 있다.
- 이 이유는 32bit 컴퓨터는 메모리 주소를 총 2^32개만 나타낼수있다. 2^32 = 4 x 2^30 (2^30 = GB)이다. 따라서 나타낼수 있는 메모리의 주소가 총 4 x 2^30개이기때문에 32bit 컴퓨터는 최대 4G의 메모리를 사용할수 있는것이다.
- 32bit 컴퓨터의 address bus는 32가닥이기 때문에 우리가 2^32bit만큼의 메모리를 사용할수있는것이다.
근데만약 내 컴퓨터의 메인 메모리는 4G지만 addressbus를 64가닥을 사용한다면 즉 주소는 2^64개를 사용한다면 물리적인 메모리 4G를 제외한 나머지 공간을 하드디스크에 지정한다. 이것이 Virtual Memory의 개념이다.
- (쓸데없는 정보)이런 논리로 접근해보면 64bit 컴퓨터는 2^64승 -> 16EB(엑사바이트)까지의 메모리를 사용할수있다는건데 사실 이정도를 지원하는 OS는 없고
현재 Window10 기준 엔터프라이즈 버전을 사용하면 6T까지의 메모리를 사용할수 있다.
결론
- Virtual Memory를 관리하는 기법은 페이징 기법, 페이징 기법의 내부 단편화 문제를 해결한 세그먼테이션 기법(페이징 기법에는 없는 외부 단편화가 생긴다는 단점이있지만) 이있는데 세그먼 테이션 기법은 다음에 알아봐야겠다.
'CS' 카테고리의 다른 글
CS) HTML,XML (0) | 2023.02.08 |
---|---|
CS) 객체지향(OOP) (0) | 2023.02.08 |
CS) Byte padding (0) | 2023.02.08 |
CS) 프로세스 메모리 구조 (0) | 2023.02.08 |
CS) CPU구조와 동작과정 (0) | 2023.02.08 |
CS) Byte padding
바이트 패딩
CPU의 연산 부하량을 줄여줄 목적으로 클래스(구조체)에 바이트(패디드 바이트)를 추가하는 기법이다.
#include <iostream>
class A {
public:
char a;
int b;
};
int main() {
A ex;
std::cout << "Size of class A: " << sizeof(ex) << " bytes" << std::endl;
return 0;
}
이때 class A의 크기는 char(1byte) + int(4byte) = 5byte지만 sizeof(ex)를해보면 5byte가 아닌 8byte가 나오는것을 확인할수있다.
이렇게 5byte가 아닌 8byte가 나오는 이유를 알아보자.
32bit 컴퓨터를 사용한다고 가정하면, CPU는 메모리에서 한번에 32bit 즉 4byte 씩 가져와 연산을한다.
char(1byte), int(4byte)
그렇다면 CPU가 위 예시에서 ex 에 대한 정보를 가져올때 4byte를 가져온다하면 a를 가져오고 (1byte) b 를 가져올때 (3byte) -> a(3byte) + b(1bye) = 4byte
그후 b의 1byte를 추가적으로 가져와야한다. 즉 int b에 관한 정보를 가져올때 4byte 단위로 가져오는 32bit컴퓨터 임에도 데이터를 2번 분활해서 가져오는 비효율적인 일이 발생한다.
이때 바이트패딩 char a가 1byte이지만 3byte 패딩바이트를 붙여 cpu가 ex에 대한 정보를 가져올때
char a(1byte) + padding byte(3byte), int b(4byte) 식으로 하나의 데이터를 끊어서 가져오는게 아닌 한번에 하나의 데이터씩 가져올수 있도록 한다.
char a(1byte)
padding(3bytes)
int b(4bytes)
따라서 바이트 패딩을 추가하여 int b
의 데이터를 한번에 가져올수 있게한다.
- Reference https://supercoding.tistory.com/37
'CS' 카테고리의 다른 글
CS) 객체지향(OOP) (0) | 2023.02.08 |
---|---|
CS) Virtual Memory (0) | 2023.02.08 |
CS) 프로세스 메모리 구조 (0) | 2023.02.08 |
CS) CPU구조와 동작과정 (0) | 2023.02.08 |
VS Code(Remote SSH) (0) | 2023.02.05 |
CS) 프로세스 메모리 구조
프로세스 메모리 구조
- 프로세스(process)란 실행중에 있는 프로그램을 의미한다. (process는 task, job이라고도 한다.)
- 이때 각 프로세스는 독자적인 주소공간을 가지고있고, 그 주소공간이 어떤 구조로 이루어져있는지 확인한다.

- Text
프로그램에 있는 함수 코드,제어문,상수등을 포함한다.Text
영역에는 실제 코드를 CPU가 실행할수 있는 기계어의 형태로 변환하여 저장하는 공간이다. - Data(BSS+GVAR)
전역변수 또는 Static 변수등이 저장되는 공간이다. - Heap
사용자가 생성한 객체들이 저장되는 공간이다.
Heap은 포인터를 사용해서 데이터를 조회한다.
동적할당되는 메모리 공간이며 java에서는 new 명령으로 할당할수 있다. - Stack
사용자가 작성한 함수에 대한 리턴 주소, 매개변수, 지역변수,등이 저장된다.
정적할당되는 메모리 공간이다.
Stack은 사용할수 있는 공간이 정해져있다. 즉 함수가 호출됨에 따라 call stack이 Stack영역에 쌓이게 되는데 재귀호출을 통해 무한히 call stack을 쌓게되면 언젠가 Stack 영역을 넘어서 stackoverflow가 발생하게 된다.
메모리 동적, 정적할당
- 메모리 동적 할당
동적할당이란 프로그래밍에서 실행시간동안 메모리 공간을 할당하는 것을 말한다.위 코드처럼 java에서new
연산자등을 활용해 프로그램 도중 필요한 양만큼을 할당하는것이다.
프로그램 종료시 Garbage Collector가 정리한다. int[] a; a = new int[5];
- 메모리 정적 할당
정적할당이란 프로그램이 실행될때 이미 메모리의 크기가 결정되어있다는 뜻이다.정적할당시 위 코드처럼 메모리의 크기가 이미 하드코딩 되어있다.
정적할당시 함수의 호출이 끝나면 사라지지만 함수가 종료될때까지 안쓰는 메모리가 낭비될수 있다. int[] a = new int[10];
Garbage Collection
- Garbage Collection(GC)란 Unreachable Object를 우선적으로 메모리에서 제거하여 메모리 공간을 확보하는 JVM에서 자동적으로 제공하는 기능이다.
- 여기서 Unreachable Object란 Stack 영역에서 접근할수 없는 Heap 영역의 객체를 말한다.
JVM 메모리 구조
- 운영체제를 통해 JVM은 메모리를 할당받으며, JVM이 할당받은 메모리 구조는 위 사진과 같다.
- Heap 메모리
JVM이 객체 또는 동적 데이터를 저장하는 곳이며(모든 Object타입(String,Integer,ArrayList..)), Garbage Collection(GC)이 일어나는 곳이기도하다.
Stack 영역과는 다르게 몇개의 스레드가 존재하든 하나의 Heap 영역만 존재한다. - Young generation
새로운 객체가 저장되는 곳이며 짧게 살아남는 메모리들이 존재하는 공간이다.
Yong generation영역에서 발생되는 garbage collection을 Minor GC라고 하며 Young generation은 Minor GC에서 관리하는 공간이다 - Old generation
Young generation과는 다르게 길게 살아남는 메모리들이 존재하는 공간이다.
Young generation에서 GC에의해 제거되지 않은 경우 Old generation으로 이동한다.
Old generation을 관리하는 GC를 Major GC라고 부른다. - Thread Stacks
스택메모리 영역이며, 프로세스의 스레드당 하나의 스택 메모리가 존재한다. - Stack 영역에는 Heap영역에 생성된 Object 타입의 데이터의 참조값이 할당되며,원시타입의 데이터가 값과 함께 할당된다.
Reference
- https://dev.to/deepu105/visualizing-memory-management-in-jvm-java-kotlin-scala-groovy-clojure-19le
- https://velog.io/@seyoung755/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%AA%A8%EB%8D%B8%EA%B3%BC-%EA%B4%80%EB%A6%AC-%EB%B0%A9%EC%8B%9D%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC
- https://deepu.tech/memory-management-in-programming/
- JVM(Stack & Heap )
https://yaboong.github.io/java/2018/05/26/java-memory-management/
'CS' 카테고리의 다른 글
CS) 객체지향(OOP) (0) | 2023.02.08 |
---|---|
CS) Virtual Memory (0) | 2023.02.08 |
CS) Byte padding (0) | 2023.02.08 |
CS) CPU구조와 동작과정 (0) | 2023.02.08 |
VS Code(Remote SSH) (0) | 2023.02.05 |