1. DCL

  • Data Control Language의 약자로, 데이터 제어 언어라고 한다. 
  • 조작 대상으로는 사용자 권한과 트랜잭션이 있다.
  • 트랜잭션의 제어를 위한 명령어로 TCL이라는 용어가 있다.
  • TCL은 DCL에 속해 있다고 보기도 하지만 TCL과 DCL은 서로 다른 개념으로 구분한다.  
사용자 권한 접근 통제  - DBMS에 접근할 사용자를 등록한다. 
 - 특정 사용자에게 DB의 사용 권한을 부여하는 작업이다.
트랜잭션 안전, 무결
거래 보장
 - 동시 다발적으로 발생하는 다수 작업을 독립적이고 안전하게 처리하기 위한 DB의 작업 단위이다.

 

[DCL & TCL]

DCL GRANT
REVOKE
 - DB 사용자 권한 부여
 - DB 사용자 권한 회수
TCL COMMIT
ROLLBACK
CHECKPOINT
 - 트랜잭션 확정
 - 트랜잭션 취소
 - 복귀지점 설정

 

[DCL 작성]

(1) 권한 부여

#시스템 권한
GRANT 권한1, 권한2 TO 사용자계정

#객체 권한
GRANT 권한1, 권한2 ON 객체명 TO 사용자계정

 

(2) 권한 회수

#시스템 권한
REVOKE 권한1, 권한2 FROM 사용자계정

#객체 권한
REVOKE 권한1, 권한2 ON 객체명 FROM 사용자계정

 

2. TCL

[개념]

  • 트랜잭션이란, 일을 처리하는 단위이자 분해되지 않는 최소 단위이다.
  • 논리적인 연산 단위이자 하나 이상의 SQL문이 포함된다.
  • 또한 거래를 의미하기도 하며 거래의 모든 결과가 모두 반영되거나 모두 취소되어야 한다.

 

[권한]

구분 명령어 권한 내용
시스템 권한 CREATE USER 계정 생성
SESSION DB 접속
TABLE 테이블 생성
VIEW 뷰 생성
SEQUENCE 시퀀스 생성
PROCEDURE 함수 생성
DROP USER 계정 삭제
ANY TABLE 테이블 삭제
 
구분 권한 내용
객체 권한 ALTER 테이블 변경
INSERT 데이터 조작
DELETE
SELECT
UPDATE
EXECUTE PROCEDURE 실행

 

 

 

 

'SQL' 카테고리의 다른 글

DML  (0) 2022.03.07
DDL  (0) 2022.02.25
SQL 문법 정리  (0) 2022.02.09

[다중 테이블 검색 기법]

  • 조인
  • 서브쿼리
  • 집합 연산자

 

1. 조인

[개념]

  • Join, 결합을 의미하며 RDB에서의 조인은 교집합 결과로 데이터 결합 방법을 의미한다. 
  • 두 테이블의 공통값을 이용하여 칼럼을 조합하는 수단으로 사용된다.
  • 보통 PK(Primary Key, 기본키)나 FK(Foreign Key, 외래키)값을 결합하여 사용한다. 
  • 세 개 이상의 테이블 조인은 두 개의 테이블을 우선 조인한 후 그 결과와 나머지 테이블을 다시 조인한다.

내부조인, INNER JOIN

[유형]

논리적 조인  - 사용자가 직접 작성한 SQL문에 의해 표현한 테이블 결합 방식
물리적 조인  - DBMS의 옵티마이저 엔진에 의해 발생하는 테이블 결합 방식
 - Nested Loop Join
 - Merge Join 
 - Hash Join
  (빨간 글씨: 처음 들어보는 단어)

 

[유형(세분)]

내부 조인  - 두 테이블에 공통으로 있는 열을 활용하는 유형
 - 공통 컬럼(열) 기반
외부 조인  - 특정 테이블의 모든 데이터 기준, 다른 테이블의 정보와 비교하여 추출한다.
 - 다른 테이블에 동일한 값이 없어도 특정 테이블은 출력된다.

 

내부조인 동등  - 공통으로 있는 컬럼값이 같은 경우 레코드(행) 추출한다.
자연  - 두 테이블에 있는 동일한 컬럼명을 기준으로 모든 컬럼값이 같은 경우 레코드(행) 추출한다.
교차  - 조인 조건이 없는 모든 데이터의 조합을 추출한다.

 

외부조인 왼쪽  - 왼쪽 테이블의 모든 데이터와 오른쪽 테이블의 동일 데이터를 추출한다.
 - 오른쪽 테이블에 동일한 값이 없어도 왼쪽 테이블의 레코드는 출력된다.
오른쪽  - 오른쪽 테이블의 모든 데이터와 왼쪽 테이블의 동일 데이터를 추출한다.
 - 왼쪽 테이블의 동일한 값이 없어도 오른쪽 테이블의 레코드는 출력된다.
완전  - My에서만 사용 가능하며 Or에서는 불가능하다고 한다. (수업메모)
 - 양쪽의 모든 데이터를 추출한다.

 - 양쪽 테이블에 동일한 값이 없어도 양쪽 테이블의 레코드는 출력된다.

 

SQL Join 종류

https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

 

Visual Representation of SQL Joins

This article describes SQL Joins in a visual manner, and also the most efficient way to write the visualized Joins.

www.codeproject.com

2. 서브쿼리

[개념]

  • SQL문 안에 포함된 또 다른 SQL문을 의미한다.
  • 확인되지 앟은 기준을 위해 검색하는 용도로 사용된다.
  • 메인쿼리와 서브쿼리는 주종관계를 이룬다.
  • 당연하게도 서브쿼리에 작성된 컬럼명은 메인쿼리의 컬럼명을 가져와서 사용할 수 있으나 역은 성립하지 않는다.

[유형1 (우선동작)]

비연관
(Un-Correlated)
 - 서브쿼리 안에 메인쿼리의 커럼 정보를 가지고 있지 않은 형태를 의미한다.
 - 메인쿼리 없이 독자적으로 실행한다.
연관
(Correlated)
 - 서브쿼리 안에 메인쿼리의 컬럼 정보를 가지고 있는 형태를 의미한다.
 - 메인쿼리의 실행된 결과를 통해 서브쿼리의 조건이 맞는지 확인한다.

[유형2 (반환 데이터 형태)]

단일 행
(Single Row)
 - 서브쿼리의 결과가 항상 1건 이하인 서브쿼리를 의미한다.
 - 단일 행의 비교 연산자에는 = , < , <= , > , >= , <> 등이 있다.
다중 행
(Multiple Row)
 - 서브쿼리의 실행 결과가 여러 건인 서브쿼리를 의미한다.
 - 다중 행의 비교 연산자에는 IN, EXISTS, ALL, ANY 등이 있다.
 - From 뒤에 또는 WHERE 절에 사용된다. (수업메모)
다중 컬럼
(Multiple Column)
 - 서브쿼리의  실행 결과가 2개 이상 컬럼으로 반환되는 쿼리를 의미한다.
 - 메인쿼리의 조건절에 다수 칼럼을 비교할 때, 서브와 메인에서 비교하는 칼럼 개수, 위치가 동일해야 한다.

 

3. 집합 연산자

[개념]

UNION  - 2개 이상 SQL문의 실행 결과에 대한 중복을 제거한 합집합 
 - ((AB) - (AB))
UNION ALL  - 2개 이상 SQL문의 실행 결과에 대한 중복을 제거하지 않은 합집합
 - A와 B
INTERSECTION  - 2개 이상 SQL문의 실행 결과에 대한 중복을 제거한 교집합
 - (AB)
 - ???, 중복 값을 한 번만 출력한다는 뜻인가?
EXCEPT (MINUS)  - 선행 SQL문의 실행 결과와 후행 SQL문의 실행 결과 사이의 중복을 제거한 차집합
 - DBMS마다 EXCEPT을 쓰기도 MINUS를 쓰기도 한다고 한다.
 - (A-B)

 

'SQL' 카테고리의 다른 글

DCL  (0) 2022.03.10
DDL  (0) 2022.02.25
SQL 문법 정리  (0) 2022.02.09

[하고자 하는 것]

MySQL 테이블과 Eclipse에 작성한 CRUD를 연동하여 데이터 입력, 수정, 조회, 삭제 해보기

 

[준비물]

MySQL 테이블 

  • 테이블명: sample
  • 컬럼명: num, strData, sampleDate

 

Eclipse CRUD

  • C(create): 입력
  • R(read): 조회
  • U(update): 수정
  • D(delete): 삭제

[코드 작성 SampleVO, SampleDAO, DbUtil]

 

[DB와 연결할 필드, 생성자 Get/Set]

// SampleVO.java

import java.util.Date;

public class SampleVO { 

	private int num; 
	private String strData;
	private Date sampleDate;
	
	//default constructor
	public SampleVO() {
	}

	//using fields
	public SampleVO(int num, String strData, Date sampleDate) {
		this.num = num;
		this.strData = strData;
		this.sampleDate = sampleDate;
	}

	//override toString()
	@Override
	public String toString() {
		return "SampleVO [num=" + num + ", strData=" + strData + ", sampleDate=" + sampleDate + "]";
	}

	//getters & setters
	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getStrData() {
		return strData;
	}

	public void setStrData(String strData) {
		this.strData = strData;
	}

	public Date getSampleDate() {
		return sampleDate;
	}

	public void setSampleDate(Date sampleDate) {
		this.sampleDate = sampleDate;
	}
}

[DB 연결하는 함수 / DB 연결 해제하는 함수]

public class DbUtil {
    
    //DB연결
    public Connection dbConn() {
    	
        String url = "jdbc:mysql://localhost:3306/smart?characterEncoding=UTF-8&serverTimezone=Asia/Seoul";
        String user = "";
        String password = "";
        
        Connection conn = null;
        
        try {
            //드라이버로드
            Class.forName("com.mysql.cj.jdbc.Driver");
            //DB연결
            conn = DriverManager.getConnection(url. user, password);
         //원래는 ClassNotFoundException이지만 SQL 연결 이후 SQLException이 또 발생하기 때문에 바로 Exception으로 바꿔준다.
        } catch (Exception e) {
            e.printStackTrace();
        }
        //연결되는 변수명을 리턴해준다.
        return conn;
    }
    
    //DB해제(닫아줘야 할 3개의 변수)
    public void dbClose(Connection conn, Statement stmt, Resultset rs) {
        
        try {
            if (rs !=null) rs.close();
            if (stmt !=null) stmt.close();
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

[CRUD]

package dao;
/**
 * 하면서 느낀 점: 
 * DB열고 닫는 함수를 사용하기 전 과정은 어느 정도 기억에 남으나
 * 함수를 사용하고 나서는 순서가 꼬여서 그런지 동선에 혼동이 자주 온다.
 */
import java.sql.Connection;  
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.sql.Date;

import domain.ExamVO;
import domain.SampleVO;
import util.DbUtil;

public class SampleDAO extends DbUtil {

	public void create(SampleVO vo) {

		StringBuffer sql = new StringBuffer();

		sql.append(" \n INSERT INTO sample ");
		sql.append(" \n (num, strDate, sampleDate) ");
		sql.append(" \n VALUES (null, ?, curdate()) ");

		Connection conn = null;
		PreparedStatement stmt = null;
		// SampleVO sampleVo = null; create문에선 쓰이지 않는다.
		
		int idx = 0;

		try {
			// DB연결
			conn = dbConn();
			stmt = conn.prepareStatement(sql.toString());

			// 값설정
			stmt.setString(++idx, vo.getStrData());

			// 실행*****
			int res = stmt.executeUpdate();
			// stmt.setDate(++idx, new Date(vo.getSampleDate().getTime()));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			dbClose(conn, stmt, null);
		}
	} 
	
	public List<SampleVO> read() {

		StringBuffer sql = new StringBuffer();
		sql.append(" SELECT * FROM sample ");
		
		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		//개념다시 잡을 것 <>: 제네릭? 이해 못함.
		List<SampleVO> list = new ArrayList<SampleVO>();
		//코드작성
		try {
			//DB연결
			conn = dbConn();
			//prepareStatement(SQL작성 실행)
			stmt = conn.prepareStatement(sql.toString());
			rs = stmt.executeQuery();
			//결과처리(Select문만 ResultSet 객체 리턴)
			while(rs.next()) {
				SampleVO vo = new SampleVO(
						rs.getInt("num"),
						rs.getString("strData"),
						rs.getDate("sampleDate")
				);
				list.add(vo);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			dbClose(conn, stmt, null);
		}
		//닫기
		return list;
	}

	public SampleVO read(SampleVO vo) {

		StringBuffer sql = new StringBuffer();
		sql.append(" SELECT * FROM sample" );

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		SampleVO sampleVo = null;
		try {
			//드라이버로드
			conn = dbConn();
			stmt = conn.prepareStatement(sql.toString());
			//idx
			stmt.setInt(1, vo.getNum());
			//쿼리실행
			rs = stmt.executeQuery();
			
			//next()사용법 
			if (rs.next()) {
				sampleVo = new SampleVO(
						rs.getInt("num"),
						rs.getString("strData"),
						rs.getDate("sampleDate")
						);
				}
			} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			} finally {
				dbClose(conn, stmt, rs);
			}
		return sampleVo;
	}
	
	public void update(SampleVO vo) {
		
		StringBuffer sql = new StringBuffer();
		sql.append(" UPDATE sample SET strData = ?, sampleDate = curdate() WHERE num = ? ");
		
		Connection conn = null;
		PreparedStatement stmt = null;
		
		int idx = 0;
		
		// ResultSet rs = null; read()문만 쓰이나?
		
		try {
			//
			conn = dbConn();
			//
			stmt = conn.prepareStatement(sql.toString());
			//
			stmt.setString(++idx, vo.getStrData());
			stmt.setInt(++idx, vo.getNum());
			
			int res = stmt.executeUpdate();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			dbClose(conn, stmt, null);
		}
	}
	
	public void delete(SampleVO vo) {
		StringBuffer sql = new StringBuffer();
		sql.append(" DELETE FROM sample WHERE num = ? "); 
		
		Connection conn = null;
		PreparedStatement stmt = null;
		
		try {
			//DB연결
			conn = dbConn();
			//prepareStatement(SQL작성 실행)
			stmt = conn.prepareStatement(sql.toString());
			
			stmt.setInt(1, vo.getNum());
		
			
			int res = stmt.executeUpdate();
			//결과처리(Select문만 ResultSet 객체 리턴)
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			//DB해제
			dbClose(conn, stmt, null);
		}
		
	}
}

 


[후기 및 느낀 점]

1. read()문 하면서 제네릭에 대한 이해가 없다는 것을 알게 됨.

(+) while문 돌리는 이유와 어떻게 작성했는지 기억할 것

 

2. 구문 작성 시 순서 기억할 것

(드라이버로드, DB연결, SQL문 작성, Statement 만들기, SQL문 실행, SELECT문 실행 및 반환, DB 닫기) 

 

3. Date 사용법 

 

4. DB 연결하고 해제하는 함수 사용 후 기존에 존재하는 중복구문 제대로 삭제하기

 

5. SQL 구문 적용 시 어떻게 MySQL에서 찍어내고 결과값 조회하게 할지 생각하고 적용하기

 

https://rok.wiki/rok/history.php

 

라오킹위키

라이즈오브킹덤즈 공략 커뮤니티

rok.wiki

 

따라 만들어 본 사이트

https://github.com/HandWend/jsp_web_demo.git

 

GitHub - HandWend/jsp_web_demo

Contribute to HandWend/jsp_web_demo development by creating an account on GitHub.

github.com

 


[제작 따라하기 결과물]

1. 사이트 모습

구현된 사이트 모습

 

2. 사용된 프로그램 및 파일들: 이클립스 / MySQL

이클립스(jsp / java), MySQL

 

3. 새로 알게 된 언어: Ajax / Json

 

4. 오늘 과정을 겪고 느낀 점

갈 길이 차리창창 먼데 와중에 배운 개념들을 한 번씩 써먹어서 결과물(?)을 만들 수 있다는 것을 알 수 있어 생산적이었다.

 

5. 더 나아가야 할 부분

  • 아직 개념이 제대로 정립되지 않은 것 (hasnext()와 next())
  • 여러 파일을 열고 한 번에 작업 시 계속해서 동선에 혼란이 오는 것 (클래스 파일 혼동) 
  • 오타 및 문법 오류 잡아내지 못하는 것 (파일명 오타 및 문단속 철저히 할 것)
  • 언어에 대한 이해도가 아직 부족한 것 (java)

 

'기타' 카테고리의 다른 글

0426 이것저것 사이트(2)  (0) 2022.04.26
0407 javascript 및 이것저것 사이트  (0) 2022.04.07
사이트 + 0330 수업 중 막힌 부분  (0) 2022.03.30

1. 개념

  • DDL(Data Definition Language), 영문 그대로 데이터를 정의하는 언어
  • 직관적인 설명으로는 데이터를 담을 그릇을 생성하는 언어
  • 이렇게 생성된 그릇을 DBMS(Database Management System)에서는 오브젝트(Object)라고 한다.

[DDL 대상]

DDL 대상 설명
스키마
(Schema)
 - DBMS의 특징과 구축 환경에 기반한 데이터 구조
 - 하나의 데이터베이스(이하 DB)라고 이해할 수 있음
도메인
(Domain)
 - 속성의 데이터 타입과 제약 조건 등을 설정한 정보
 - 속성이 가지는 값의 범위로 이해 가능
테이블
(Table)
 - 데이터 저장 공간
 - 이해하기 쉬운 개념으로는 '표'가 있음

(View)
 - 1개 이상의 물리 테이블을 통해서 만드는 가상의 논리 테이블
인덱스
(Index)
 - 빠른 검색을 위한 데이터 구조
 - 책이나 논문의 차례 또는 개요라고 볼 수 있음

 

2. 유형(생성, 변경, 삭제/제거)

구분 명령어 내용
생성 CREATE 생성
변경 ALTER 변경
삭제 DROP 삭제
TRUNCATE 내용 삭제

 

DDL 명령어로 분류되지는 않지만 DDL과 같이 사용되는 명령어가 있는데

M에서는 생성된 오브젝트의 목록을 조회하기 위해 SHOW 명령문을 사용하고 내용을 조회하기 위해서는 SELECT를 사용한다.

O에서는 SELECT로 목록과 내용을 조회한다.

 

3. 작성 (스키마, 도메인, 뷰, 인덱스 추가할 것)

[테이블 생성, CREATE문]

CREATE TABLE 테이블명 (
#아래부분은 참고
    칼럼명 데이터타입 [DEFAULT값][NOT NULL]
    {, 칼럼명 데이터타입 [DEFAULT값][NOT NULL]}*
    [PRIMARY KEY (칼럼 리스트),]
    {[FOREIGN KEY (칼럼 리스트) REFERENCES 테이블명 [(칼럼명)]
    	[ ON DELETE 옵션 ]
        [ ON UPDATE 옵션 ] ], }*
    [CHECK (조건식) | UNIQUE(칼럼명) ] );
    
-- 테이블 복제
CREATE TABLE 테이블명 AS SELECT문;

 

[제약조건]

제약 조건 설명
PRIMARY KEY (PK)  - 테이블의 기본키
 - 기본적으로 NOT NULL, UNIQUE 제약 사항이 결정된다.
FOREIGN KEY (FK)  - 테이블에 외래키 정의
 - 참조 대상을 테이블명(칼럼명) 형식으로 작성해야 한다.
 - 참조 무결성이 위배되는 상황 발생 시 다음 옵션으로 처리가 가능하다
   (CASCADE, NO ACTION, SET NULL, SET DEFAULT)
UNIQUE  - 테이블에서 해당하는 값은 유일해야 함을 의미한다.
 - 테이블에서 모든 값이 다르게 적재되어야 하는 열에 설정한다.
NOT NULL  - 테이블에서 해당하는 열의 값은 NULL이 불가능하다
 - 필수적으로 입력해야 한다는 뜻이다.
CHECK  - 사용자가 직접 정의하는 제약 조건이다.
 - 발생 가능한 상황에 따라 여러 가지 조건을 설정할 수 있다.

사실 맨 윗줄 외엔 딱히 실전에서 써보지 않은 거라 뭐라 말은 못하겠지만 

짐작하는 바로는 (*)이 붙은 것은 있을 수도 있고 없을 수도 있다는 것으로 보인다.  

 

[테이블 변경, ALTER문]

--열 추가
ALTER TABLE 테이블명 ADD 칼럼명 데이터타입 [DEFAULT값]

--열 데이터 타입 변경
ALTER TABLE 테이블명
    MODIFY 칼럼명 데이터타입 [DEFAULT값]
    
--열 삭제
ALTER TABLE 테이블명 DROP 칼럼명

--테이블명 변경(1)
RENAME TABLE 이전테이블명 TO 새로운테이블명

--테이블명 변경(2)
ALTER TABLE 이전테이블명 RENAME 새로운테이블명

 

[테이블 삭제, DROP / TRUNCATE문]

--테이블삭제
DROP TABLE 테이블명

--테이블내용삭제
TRUNCATE TABLE 테이블명

'SQL' 카테고리의 다른 글

DCL  (0) 2022.03.10
DML  (0) 2022.03.07
SQL 문법 정리  (0) 2022.02.09

[최적화]

1. 패턴

(1) 싱글톤(Singleton)

  • 설정 파일의 특정 값과 같이 동일한 인스턴스를 참조할 때 하나의 인스턴스만 생성하여 처리함으로 자원을 효율적으로 사용 가능하다.
  • 소스코드를 참조하여 하나의 인스턴스로 처리가 가능한 경우에 적용한다.

(2) 스트래티지 패턴(Strategy Pattern)

  • 사용자가 자신에게 맞는 전략을 취사선택하여 로직을 수행할 수 있는 방법
  • 향후 확장성에 대한 고려가 필요한 경우 소스코드를 참조하여 적용

(3) 디자인 패턴의 종류와 설명

구분 종류 설명
생성 패턴
Creational
 Patterns

[FPS_BAF]
Factory Method 어떤 클래스의 인스턴스를 만들지 서브클래스에서 결정하도록 책임 위임
Abstract Factory 관련 있는 객체들을 모아 팩토리로 만들고 조건에 따라 선택하게 함
Builder 객체의 생성 단계를 캡슐화하여 구축 공정을 동일하게 이용하도록 함
Prototype 원형이 되는 객체를 복제하여 새로운 객체를 생성
Singleton 인스턴스를 한 번만 생성하여 메모리에 저장하여 사용함으로 하나의 인스턴스를 보장
구조 패턴
Structural
 Patterns

[ABCD'E'FP]
Adapter 서로 다른 인터페이스를 가진 클래스를 함께 사용할 수 있도록 
Bridge 기능과 구현을 분리하여 독립적으로 변형과 확장이 가능하도록 결합도를 낮춤
Composite 여러 개의 객체들로 구성된 복합/단일 객체를 클라이언트에서 동일하게 사용
Decorator 객체에 추가적인 기능을 유연하게 확장
Facade 복잡한 클래스들을 묶어 통합된 인터페이스를 제공
Proxy 실제 객체가 아닌 가상 객체를 통해 기능을 처리
행위 패턴
Behavioral
 Patterns

[나머지]
Interpreter 문법 규칙을 정의하고 해석
Template 공통 메소드를 상위 클래스에서 정의, 세부사항은 하위 클래스에서 구현
Command 요청을 캡슐화하여 여러 기능 실행
Iterator 컬렉션의 구현은 노출시키지 않고 요소들에 접근 가능
Mediator 객체들 간 상호작용 행위를 캡슐화하여 관리
Memento 객체의 상태정보를 저장하고 원하는 시점의 이전 상태로 복원 가능
Observer 객체의 상태가 업데이트되면 객체에 의존하는 다른 객체에 알리고 자동으로 내용 갱신
Strategy 행위를 클래스로 캡슐화하여 필요에 따라 동적으로 대체가 가능
Visitor 데이터와 구조를 분리하여 구조를 수정하지 않고 새로운 기능 추가 가능

 

2. 프로그래밍 언어 특성에 따른 보안 취약점 검토 및 최적화

(1) 입력 데이터 검증 및 표현 측면의 보안 약점 확인 및 최적화

SQL 삽입 공격  - 공격자가 form 및 URL 입력란에 SQL문을 삽입하여 DB 조회 및 조작 할 수 있음
 - preparedStatement를 사용하고 입력값에 대해 SQL 구문 / 특수문자 / 길이 제한 등 필터링 적용
경로 조작 및
자원 삽입 공격
 - 검증되지 않은 입력값 허용하는 경우 악의적 코드 실행 또는 시스템 자원 무단 접근 가능
 - 자원 식별자(IP, Port, Directory)와 같은 중요 정보는 외부에서 입력받지 않고 처리
 - 다른 경로 파일을 접근이 가능할 수 있는 위험한 문자열 (", /, \)을 제거
파일 업로드  - 파일의 확장자와 형식에 댛나 검증 없이 업로드하는 경우 .exe 같은 실행파일은 위협이 될 수 있음.
 - 확장자와 형식을 확인하여 업로드가 가능하도록 개선
정수 오버플로  - 정수형 변수에 저정된 값이 허용된 정수값 범위를 벗어나 프로그램이 예기치 않게 동작 가능
 - data type의 범위에 있는지 사전체크

 

(2) 보안 기능 측면의 보안 약점 확인 및 최적화

  • 중요 정보를 적절한 인증 없이 조회 및 변경 가능한 취약점 존재 여부 확인 후 인증 추가
  • 개인정보 및 비밀번호 등 중요 정보 전송 또는 저장 시 암호화하지 않아 노출되는 취약점 존재 파악 후 암호화처리
  • 소스코드에 중요정보를 직접 코딩한 경우 코드 유출시 정보 노출 및 변경 어려운 취약점 존지 확인 후 관리 및 개선
  • 인증 시도 수를 제한하지 않아 공격자가 반복적으로 임의 값을 입력하여 계정 권한을 획득 가능한지 파악 후 제한

 

(3) 에러 처리 / 코드 오류 에서 발생할 수 있는 보안 약점 확인 및 최적화

  • 오류 메시지나 스택 정보에 시스템 내부구조가 포함되어 민감한 정보
  • 디버깅 정보가 메시지를 통해 노출되는 취약점 존재 확인 후 개선
  • 시스템 오류 상황 처리하지 않아 실행정지 등 의도치 않은 상황이 발생 가능한 취약점 파악 후 개선

 

(4) 언어 특성에 따라 발생할 수 있는 성능과 가용성 문제

  • 데이터 전송 속도 확인 및 최적화
  • 클라이언트 처리속도 확인 및 최적화
  • 데이터베이스로부터 조회되는 속도 확인
  • 가용 자원의 현황과 프로그램 구동 시의 점유율을 확인하여 최적화
CPU 연산 / 조건 / 반복 / 암,복호화 드으이 코드를 검토 후 최적화
메모리 자원 반환 / 연산 / 조건 / 불필요한 객체 제거 등 검토 후 최적화
디스크 용량  불필요한 로그나 파일 생성 등 검토 후 최적화

 

(5) 소스코드 품질 측면에서의 최적화

  • 프로그램 명명 가이드 기준 (패키지명 / 파일명 / 변수명 / 메소드명)
  • 프로그램 코딩 가이드 기준 (주석문 / 들였긔 / 선언문 / 블록_Block Statement)
  • 불필요한 코드가 존재하는지 파악 (필요한가 / 중복됐나 / 복잡한가)
  • 정적 분석 도구 활용하여 최적화 수행 (PMD 수행)

 


[라이브러리]

1. 라이브러리

(1) 개념과 목적

  • Library, 도서관을 의미
  • 코드의 재사용 및 부품화 / 기술 유출 방지를 위해 하나 이상의 Subroutine 혹은 함수들의 집합
  • 일반적으로 컴파일되어 실행이 가능한 Object Code 형태로 제공됨

(2) 구성

  • 도움말: 라이브러리에 대한 설명 및 사용 방법 등에 대한 도움말 문서
  • 설치파일: 라이브러리를 연동하기 위해 제공되는 설치 파일
  • 예시코드: 애플리케이션 구현 시 라이브러리를 쉽게 연동할 수 있도록 제공되는 샘플 코드

 

2. 라이브러리 유형

(1) 별도 설치 여부

표준 라이브러리
(Standard Library)
 - 프로그래밍 언어와 함께 제공되는 라이브러리
 - 표준 라이브러리 사용 시 별도의 파일 설치 없이 다양한 기능 이용 가능
 - 기본 기능 이외에 날짜와 시간 등 다양한 추가 기능 이용할 수 있는 API 제공
외부 라이브러리
(3rd Party Library)
 - 별도의 파일 설치하여 사용할 수 있는 라이브러리
 - 누구나 개발하여 사용, 공유할 수 있고 관련 커뮤니티나 검색 등을 이용해 공유된 라이브러리 사용가능

 

(2) 코드 결합 방식

정적 라이브러리
(Static Library)
 - 프로그램 빌드할 때 라이브러리가 제공하는 코드를 실행 파일에 넣는 방식
 - 컴파일러가 원시 소스를 컴파일할 때 참조되는 모듈
 - 동작 코드가 실행 바이너리에 포함되 별도의 추가 작업 없이 독립적으로 라이브러리 함수 사용 가능
동적 라이브러리
(Dynamic Library)
 - 공통적으로 필요한 기능을 프로그램과 분리하여 필요시에만 호출하여 사용할 수 있도록 만든 라이브러리
 - 필요할 때만 해당 라이브러리를 메모리로 불러들일 수 있으며
 - 실행 파일의 크기를 줄일 수 있고 사용이 끝나면 메모리에서 제거되어 효율적인 메모리 사용이 가능
 - Windows : .dll // Linux : .so

 

3. 라이브러리, 프레임워크, 아키텍처, 플랫폼

항목 설명 예시
Library 코드 재사용 및 부품화를 위해 필요한 기능에서 호출하여
사용할 수 있도록 제공되는 모듈의 집합
jQuery / DLL / Class / Jar
Framework 응용프로그램 표준 구조를 구현하기위한 클래스와 라이브러리의 모임 Spring, Django
Architecture 여러 가지 컴퓨터 구성요소들에 대한 전반적인 기계적 구조와 설계 방법 모노리틱 아키텍처 / MSA
Platform  - 여러 기능을 제공해주는 프로그램 실행이 가능한 공통 실행환경
 - 플랫폼 위에 다른 플랫폼 존재 가능
Window / Linux / JVM

+++

[JAVA 대표 외부 라이브러리 종류 및 역할]

종류 역할
Apache Commons  - 자바로 구현된 라이브러리를 모은 프로젝트
 - Codec / Compress / Collections / CSV / IO / Lang / Logging 
Google Guava  - Apache Commons와 유사한 모듈식
 - Collection, IO, 캐싱, 해싱 등 많은 독립 라이브러리 제공
Jackson  - Java Object를 JSON으로 변환하거나 반대로 변환
 - XML / YAML / CSV 등 다양한 형식의 데이터 지원
Log  - 대표적인 로깅 라이브러리, 비동기 로깅을 통한 성능 향상 및 플러그인 아키텍처, 클라우드 지원
Mockito  - 동작 제어가 가능한 가짜 객체(Mock)를 지원하는 테스트 프레임워크
Hibernate  - JAVA 클래스를 DB 테이블 / 컬렉션과 매핑

+++

 

4. 외부 라이브러리 - 라이선스별 정책 비교

라이선스 무료이용 배포허용 소스코드 수정 2차 저작물 
재공개
독점 SW와 
결합
GPL O O O O X
LGPL O O O O O
MPL O O O O O
BSD License O O O X O
Apache License O O O X O

[주요 라이선스 유형]

라이선스 설명
GNU GPL 2.0
General Public License)
 - 자유 SW 재단에서 만든 라이선스로 GNU 프로젝트에서 배포한 프로그램을 사용하기 위해 작성
 - 가장 많이 알려져 있고 의무사항도 타 라이선스에 비해 엄격한 편
 - 배포 시 저작권 표시 및 보증책임이 없다는 표시, GPL에 의해 배포된다는 사실 명시 필요
GNU Lesser GPL 
(LGPL) 2.1
 - 라이브러리와 모듈로의 링크 허용한 라이선스
 - 배포 시 저작권 표시, 보증책임 없다는 표시 및 LGPL에 의해 배포된다는 사실 명시 필요
BSD Licence
(Berkeley SW Distribution)
 - GPL / LGPL보다 덜 제한적이라 허용 범위가 넓고 소스코드 공개 의무가 없음
 - 수정 프로그램에 댛나 소스코드 공개 요구 하지 않기에 상용 SW에 무제한 사용 가능
Apache License  - 아파치 재단 (ASF)의 모든 SW에 적용되며 BSD 라이선스와 비슷하여 소스코드 공개 의무 없음
 - "Apache"라는 이름에 대한 상표권을 침해하지 않아야 한다는 조항이 명시적으로 포함
MIT License  - 미국 MIT에서 SW공학도들을 돕기 위해 개발한 라이선스
 - SW를 누구라도 무상으로 제한 없이 취급 가능 

 

5. 모듈과 패키지

구분 설명 사용법
모듈  - 한 개의 파일에서 기능을 제공 import (모듈명)
패키지  - 여러 개의 모듈을 한 개의 폴더에 묶어서 기능을 제공.
 - 패키지명과 모듈명을 import하여 불러올 수 있음
import (패키지명).(모듈명)

 

6. 빌드 도구

(1) 빌드 도구

  • 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립 SW 가공물로 변환하는 과정
  • 이런 프로젝트의 생성과 빌드, 배포 등의 작업을 위한 도구를 의미

(2) 빌드 도구 비교

구분 특징
Ant  - XML 기반의 빌드 스크립트 작성, 자유롭게 빌드 단위 지정
 - 간단하고 사용하기 쉬움
 - 큰 프로젝트의 경우 스크립트 관리나 빌드 과정이 복잡
 - 생명주기를 갖지 않아 각각의 결과물에 대한 의존관계 등을 정의
Maven  - XML 기반으로 작성되며 생명주기와 POM(Project Object Model) 개념 도입
 - pom.xml 파일을 이용해 dependency를 추가하고 삭제하여 라이브러리 관리
Gradel  - Ant와 Maven의 장점을 모아 작성되었으며 의존성 관리를 위한 다양한 방법 제공
 - 빌드 스크립트를 XML이 아닌 JVM에서 실행되는 스크립트 언어인 그루비(Groovy) 사용

 

1. 코드 인스펙션

(1) 인스펙션 수행 절차

  • 중재자, 저자, 진행자, 검토자, 기록자 등의 역할 담당자를 지정하여 진행한다.
  • 개발 초기 단계에서 결함을 식별하여 수정함으로
  • 오류로 인한 비용 최소화 / 코드 품질 향상 / 유사 결함 발생 예방 및 유지보수 효율성 향상
  • 을 목적으로 진행한다. 
단계 수행 내용
계획(Planning)  - 인스펙션 대상 산출물 선정 및 대상자를 구성
 - 인스펙션 대상 산출물 사전 배포 및 날짜, 시간, 장소 공지
개관(Overview)  - 참여자 대상 산출물에 대한 이해도 높여 인스펙션의 효과성 향상시킬 수 있음
 - 생략 가능
준비
(Preparation)
 - 구성원이 개별적으로 산출물에 대해 숙지하고 체크리스트를 활용하여 결함부분에 대해 기록
검토회의
(Meeting)
 - 산출물을 함께 검토하며 준비단계나 검토회의에서 식별된 결함 부분에 대해 집중
재작업(Rework)  - 검토회의에서 발견된 결함 수정
추적(Follow-up)  - 결함이 정상적으로 수정되었는지 최종 확인 후 인스펙션 종료

 

(2) 코드리뷰 기법 비교

  • 프로젝트 상황 및 코드의 중요도에 따라 기법 선택 및 적용
  • 동료검토 / 워크스루 / 테크니컬 리뷰 / 인스펙션
단계 수행 내용
동료검토
(Peer Review)
 - 별도 절차 없이 비공식으로 계획 없이 임의 실시 된다.
 - 개발자가 동료와 코드 및 산출물의 결함을 식별하는 기법
워크스루
(Walk Through)
 - 개발자가 리뷰의 주제와 시간을 정해서 발표 진행
 - 발표 후 동료들로부터 의견이나 아이디어를 듣는 시간을 가짐
 - 사례에 대한 정보 공유나 아이디어 수집을 위해 사용될 수 있음
인스펙션(Inspction)  - 역할과 절차, 체크리스트를 기준으로 결함을 식별하는 공식 리뷰 기법

 

2. 리팩토링(Refactoring)

SW의 원래 기능은 유지하면서 소스코드의 내부 구조를 수정 및 보완하여 
가독성, 성능향상 및 로직을 개선하는 방법이다.

(1) 주요 리팩토링 대상 및 방법

대상 방법
중복된 코드
(Duplicated Code)
 - 중복 제거
긴 메소드
(Long Method)
 - 메소드를 적정 수준의 크기로 나누기
긴 파라미터 리스트
(Long Parameter List)
 - 파라미터 개수 줄이기
게으른 클래스
(Lazy Class)
 - 자식 클래스와 부모 클래스의 차이가 없으면 합치기
주석(Comment)  - 주석이 없어도 코드를 이해할 수 있도록 소스코드 변경
메시지 체인(Message Chain)  - 특정 객체를 얻기 위한 다수 객체는 간소화
미들 맨
(Middle Man)
 - 다른 클래스로 위임하는 역할만 담당하는 클래스 제거 검토
불완전 라이브러리
(Incomplete Library)
 - 불완전 시 필요 부분 추가 구성 
스위치 명령문
(Switch Statements)
 - 지나치게 많은 case를 사용하는 Switch 문장은 코드 중복의 신호이다. 

 

(2) 리팩토링 수행 절차

출처: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=yulian&logNo=10177348055

 

3. OWASP TOP 10

OWASP(The Open Web Application Security Project)
웹 어플리케이션에 대한 보안 프로젝트

OWASP TOP 10
웹 어플리케이션 취약점 중 빈도가 많이 발생하고 보안상 영향을 크게 줄 수 있는 10가지

출처: https://owasp.org/www-project-top-ten/&nbsp;

항목 내용
접근 권한 취약점
(Broken Access Control)
 - 타인의 계정 접근 / 중요 데이터 열람 및 수정 / 엑세스 권한 변경 등
 - 악의적인 행위가 가능한 취약점
암호화 오류
(Cryptographic Failures)
 - 민감 데이터 노출 명칭의 변경
 - 적절한 암호화가 이루어지지 않으면 민감 데이터가 노출될 수 있음 
Injection  - 웹 어플리케이션에 비정상적인 명령어나 쿼리 등을 보내
 - 공격자가 시스템에 불법적으로 접근할 수 있는 취약점
Insecure Design  - 안전하지 않은 설계는 누락되거나 비효율적인 제어 설계로 표현되는 다양한 취약점
 - 안전하지 않은 설계에서 취약점으로 이어지는 구현 결함 있을 수 있음
Security Misconfiguration  - 안전하지 않은 구성, 잘못된 구성으로
 - HTTP Header나 민감 정보가 포함된 에러 메시지 등으로 인한 취약점
Vulnerable &
Outdated Components
 - 취약하고 오래된 요소
 - 지원이 종료되었거나 오래된 버전을 사용할 때 발생
식별 및 인증 오류
(Identification &
Authentication Failures)
 - 취약한 인증 + 식별 실패 --> 더 넓은 범위를 포함하게 변경되었다.
 - 사용자의 신원확인 / 인증 및 세션관리가 적절히 되지 않을 때 취약점 발생 가능 
무결성 오류
(SW & Data Integrity Failures)
 - 2021년 새롭게 등장한 카테고리
 - 무결성 확인하지 않고 SW 업데이트 / 중요 데이터 및 CI/CD 파이프라인과 관련된 가정에 중점
보안 로깅 및 모니터링 실패
(Security Logging &
Monitoring Failures)
 - 불충분한 로깅 및 모니터링 --> 보안 로깅 및 모니터링 실패로 변경
 - 진행중인 공격을 감지 및 대응하는 데 도움이 됨
서버 측 요청 위조
[Server-Side
Request Foregery (SSRF)]
 - 2021년 새롭게 등장한 카테고리
 - 웹 어플리케이션이 유저가 제공한 URL의 유효성을 검사하지 않고 원격 리소스 가져올 때 발생

 

3. 정적 분석과 PMD

(1) 정적 분석(Static Analysis)

  • 동적 분석(Dynamic Analysis)과 상대되는 개념
  • SW를 실행하지 않고 코드 레벨에서 분석하는 방법
  • 소스코드의 실행 없이 코드의 의미를 분석해 결함을 찾아내는 코드 분석 기법
  • 오류가 존재하는 부분을 사전에 식별해 영향 범위 최소화 가능
  • 테스팅 단계에서의 부담을 줄여 프로그램의 품질 높일 수 있음

 

(2) PMD(Progrmming Mistake Detector)

  • 응용 프로그램 코드의 문제를 사전에 확인할 수 있는 정적 분석을 위한 오픈 소스코드 분석 도구
  • 기본 제공 규칙 세트가 포함되어 있고 사용자 지정 규칙 작성 가능
  • 단독 형태로도 사용할 수 있고 이클립스 등과 같은 IDE에 플러그인 형태로 배포되어 누구나 사용 가능하다

---

1. 토이메이커스 / 소프트웨어공학

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=yulian&logNo=10177348055 

 

리팩토링(Refactoring)

■ Code Smell을 제거한 SW품질 향상기법, Refactoring의 정의- 코드의 가독성이 낮거나 중복된 로직 ...

blog.naver.com

 

2. OWASP TOP 10

https://owasp.org/www-project-top-ten/

 

OWASP Top Ten Web Application Security Risks | OWASP

The OWASP Top 10 is the reference standard for the most critical web application security risks. Adopting the OWASP Top 10 is perhaps the most effective first step towards changing your software development culture focused on producing secure code.

owasp.org

 

[프로그래밍 언어의 발전 과정과 유형 분류]

 

1. 프로그래밍 언어의 발전 과정

1970s 이전 1970s 1980s 1990s 2000 ~
FORTRAN
(1954)

CORBOL
(1959)

BASIC
(1964)

BCPL
(1967)
PASCAL
(1970)

C
(1972)

SMALLTALK
(1972)

SQL
(1978)
ADA, C
(1983)

 Objective-C
(1986)

Perl
(1987)
Python, HTML
(1991)

JAVA, PHP
(1995)
C#
(2001)

Scala
(2003)

Go
(2009)

Swift(2014)

+++

정리하며 적다가 의문이 들어 한 줄 첨가.

숨은 개발자 찾는 방법 from 조코딩 유튜브 Shorts

+++

 

2. 프로그래밍 언어의 유형 분류

(1) 개발 편의성

저급 언어 고급 언어
 - 컴퓨터 직접 이해할 수 있는 언어
 - 실행속도 빠름
 - 호환성이 없고 유지관리가 어려움 (기계어 상이)
 - 개발자가 이해할 수 있도록 소스코드를 작성할 수 있는 언어
 - 실행을 하기 위해서는 번역 과정이 필요함
 - 기계어, 어셈블리어  - C, C++, JAVA, PYTHON, .NET

 

(2) 실행 및 구현 방식에 따른 분류

명령형
(Imperative)
 - 컴퓨터가 동작해야 할 알고리즘을 통해 프로그래밍의 상태를 변경시키는 구문에 중점을 둚.
 - C, FORTRAN, PASCAL, COBOL
함수형
(Functional)
 - 함수의 응용을 강조하면서 자료의 처리는 수학적 함수의 연산으로 취급.
 - 상태와 가변데이터는 멀리하는 방식
 - LISP, Scala, SCHEHE, ERLANG, ML
논리형
(Logic)
 - 논리 문장을 이용하여 프로그램을 표현하고 조건이 만족되면 연관된 규칙이 실행되는 방식
 - PROLOG
객체지향
(Object-Oriented)
 - 객체 간의 메시지 통신을 이용하여 동작하는 방식
 - JAVA, C++, SMALLTALK, PYTHON

 

(3) 빌드 방식에 따른 분류

: 프로그램 소스코드가 실행 가능한 형태로 변하는 과정을 "빌드"라고 한다.

컴파일  - 소스코드를 컴파일러를 통해 실행 가능한 형태의 기계어로 미리 번역하는 과정이 필요.
 - 실행에 필요한 정보가 미리 계산되어 구동하는 시간은 오래 걸리지만 실행속도가 빠름.
  - FORTRAN, C, C++, PASCAL
인터프리터  - 별도의 컴파일 과정 없이 바로 실행 가능한 장점이 있음
 - 소스코드를 하나씩 번역하여 실행함으로써 실행속도는 느린 특징이 있음
 - 별도의 BASIC, PROLOG, LISP, SNOBOL
바이트 코드  - 컴파일을 통해 고급언어를 중간 언어로 변환 후 가상머신에 의해 번역을 실행하는 방식
 - 여러 환경에서 사용 가능
 - JAVA, SCALA

 

2. 언어별 특성 (+정보처리기사)

(1) 프로그램 언어별 설명 및 특성

FORTRAN  - IBM에서 과학적인 계산을 하기 위해 시작된 언어
 - 간결하고 엄격한 구문 형식의 언어
 - 컴퓨터 시스템에 대해 많은 관련 지식이 필요함
 - 기상예측, 자원탐사, 우주항공, 유체 및 구조해석 등의 과학계산 전문 분야에 활용
COBOL  - 미국 국방성에 의해 개발되었으며 비즈니스, 금융, 회사/장부 관리 시스템에 주로 사용
 - 메인프레임 컴퓨터의 레거시 응용프로그램들에 사용되고 있음
 - 비교적 프로그램 크기가 크고 구문이 복잡함
PASCAL  - 잘 짜인 구조와 간결성으로 프로그래밍 교육을 위해 널리 사용됨
 - 파스칼 --> (+객체지향) 오브젝트 파스칼 --> (+변형) 델파이
C  - UNIX 운영체제 구현에 사용되는 언어
 - 효율적인 실행과 간결한 문법, 효과적인 포인터 타입 제공이라는 특징으로 많이 사용되고 있음
C++ / C#  [C++]
 - C 언어에서 발전한 언어로 다중 상속 등의 기능을 제공하는 객체지향 언어

 [C#]
 - C와 C++에서 발전된 형태
 - .NET 환경에 맞춰 설계되었으며 UI를 쉽게 만들 수 있는 컴포넌트 기능 제공
PHP  - 웹 개발에 특화된 언어로 다양한 프레임워크를 지원
 - 특별한 컴포넌트 설치를 하지 않아도 다양한 처리 가능
JAVA  - C++에 비해 단순하고 분산환경, 객체지향, 보안성 지원
 - 컴파일을 통해 class파일을 생성하며 가상머신(JVM)에서 실행
JAVASCRIPT  - HTML, CSS와 함께 웹을 구성하는 핵심 요소
 - 거의 모든 웹 브라우저에 스크립트 엔진(인터프리터)이 존재
 - 웹 페이지의 동작 구현이 가능하고 빠른 개발과 확장성이 뛰어남
 - 타 언어에 비해 상대적으로 보안이나 성능이 부족
PYTHON  - 배우기 쉽고 이식성이 좋은 언어
 - 다양한 함수들도 많이 제공되어 최근 트렌드와 맞물려 다양한 곳에서 많이 사용되는 언어
GOLANG  - 구글에서 만든 언어로 줄여서 GO라고도 부름
 - 내장 라이브러리가 많아 지원되고 C언어의 문법과 유사하며
 - 제어구조를 가지고 빠른 컴파일이 가능
KOTLIN  - JAVA보다 간결한 문법을 가지고 있는 JVM 기반의 언어
 - JAVA와의 상호 운용이 100% 지원됨
 - 구글이 2019년 안드로이드의 공식 언어로 추가
R  - 통계 및 그래프 작업을 위한 인터프리터 프로그래밍 언어
 - 수많은 통계 관련 패키지가 개발되어 있으며 빅데이터 분석 및 기계학습에 유용

 

(2) 절차지향 VS 객체지향

https://k96-ozon.tistory.com/13

+++

저 망할 속성 메소드를 못해서 오늘도 쿠사리를 먹었다..

+++

 

1) 객체지향의 구성요소와 특징

 [구성요소]

  • 객체: 개체와 속성, 메소드로 구성된 클래스의 인스턴스를 의미한다.
  • 클래스: 공통된 특성(속성, 연산)을 가지는 객체 집합으로 객체 타입을 정의하고 생성하는 틀.
  • 메시지: 객체 간 상호작용은 메시지를 통해 이루어지며 객체에서 객체로 전달된다.

 [특징]

  • 캡슐화: 연관된 데이터와 데이터를 처리하는 함수를 묶어 외부에는 필요한 인터페이스만 노출시킴.
  • 정보은닉: 다른 객체에게 자신의 필드와 메소드 등을 은닉하고 자신의 연산만 통해 접근을 허용한다.
  • 추상화: 불필요한 부분은 생략하고 주어진 문제나 시스템 중에 중요한 부분에 집중하여 모델링한다.
  • 상속: 하위 클래스에서 상위 클래스의 속성과 메소드를 물려받는 기법으로 클래스와 객체의 재사용이 가능하다.
  • 다형성: 하나의 메시지에 대해 각 객체의 고유한 방법으로 응답한다. 

 

 2) 절차지향 vs 객체지향

절차지향 구분 객체지향
함수 구성 객체
전체적인 기능 동작을 고려한 
각 단계별 기능 구현
구현방식 필요한 속성의 객체 모델링 후
상호작용 기능 구현
- 접근제어 가능(public, private)
- 상속/다형성 가능
낮음 보안성 높음
프로그램 흐름을 쉽게 추적 가능
복잡도가 단순하고 실행속도가 상대적으로 빠름
장점 뛰어난 재사용 및 확장성, 유지보수의 용이성
규모가 크고 협업이 필요한 대형 프로젝트에 적합
대형 프로젝트 시 구조복잡, 중복코드 발생
유기성이 높아 신규 기능 추가가 어려움
단점 상대적으로 속도가 느리고 메모리 사용률이 높음
설계 과정에 많은 시간 소요
C, Fortran, Pascal 언어 JAVA, C++, Python

 

(3) 프로그래밍 언어별 사용 용도

웹(프론트엔드)  HTML, CSS, Javascript, JSP, PHP, ASP etc.
모바일  Android: JAVA, Kotlin 
 iOS: Object C, Swift
데스크톱  C, C++, C#
게임  C, C++, Unity
AI / 빅데이터  Python, R

 

---

1. 공대남의 정보수용소 / 절차지향 VS 객체지향

https://k96-ozon.tistory.com/13

 

프로그래밍 언어 종류 : 절차지향 VS 객체지향

안녕하세요? 대남이 입니다. 이제 프로그래밍이 필수 교육과정으로 채택되었습니다. 프로그래밍은 저희의 삶과 일상에서 긴밀하게 이어져 있으며 4차 산업혁명이 도래하며 더욱 더 ! 중요한

k96-ozon.tistory.com

 

+ Recent posts