fullstack

'전체 글'에 해당되는 글 76건

  1. [C++] 상속의 조건. is-a 와 has-a
  2. [JSP] JSP Scripting
  3. [C] call by value & call by reference

[C++] 상속의 조건. is-a 와 has-a

Language/C++

상속의 조건에는 is-a 관계에 의한 상속과 has-a 관계에 의한 상속이 있다.




- is-a 관계에 의한 상속


is-a 관계에 의한 상속은 "~은 ~이다." 가 성립되는 관계를 말한다. 예를 들어 보자.


" A student is a person. " (학생은 사람이다)


위의 예에서 student가 Derived 클래스, person이 Base 클래스가 되는 것이다. 

Derived 클래스는 Base 클래스의 모든 멤버를 상속받기 때문에  모든 student는 person의 특징을 지니게 되는 것이다.

만일 반대로 "A person is a student." 라고 한다면 모든 사람이 학생은 아니기 때문에 이는 성립하지 않는다.


위 예를 코드로 나타내면 다음과 같다.


1
class Person : public Student





- has-a 관계에 의한 상속


has-a 관계에 의한 상속은 "~은 ~을 소유한다." 가 성립되는 관계를 말한다. 예를 들어 보자.


" The student have a book. " (학생은 책을 소유한다)


위의 예는 다음과 같이 코드로 나타낼 수 있다.


1
class Student : public Book


이처럼 상속은 소유를 표현하기 위해서도 사용될 수 있다.




- has-a 관계에 의한 포함


위에서 소유를 표현하기 위해서 상속을 사용하였는데, 이는 포함을 통해서도 표현할 수 있다.


1
2
3
4
5
6
class Student
{
    Book book;
public:
    void readBook() { book.read(); }
};



클래스 객체 멤버로 Book을 Student 클래스 안에서 선언하였다.
위에 예제처럼 상속을 사용하지 않고도 소유를 표현할 수 있다.

그럼 어떤 것이 좋은 방법이라고 할 수 있을까?
상황에 따라 다르겠지만 상속에 의해 소유를 표현하게 되면 결합도가 높아지게 된다.(객체지향에서 결합도는 낮을수록 좋다)
따라서 has-a 관계에서는 상속 관계 보다는 포함 관계를 사용하는 것이 좋다고 할 수 있다.


'Language > C++' 카테고리의 다른 글

[C++] 오버라이딩 (Overriding)  (0) 2015.12.24
[C++] 객체 포인터  (0) 2015.12.22
[C++] 상속 (Inheritance)  (0) 2015.12.03
[C++] mutable 키워드  (0) 2015.12.03
[C++] explicit 키워드  (0) 2015.12.02

[JSP] JSP Scripting

Web

JSP의 스크립팅 요소(Scripting Element)에 대해 알아보자.




- 지시문 (Directive)


JSP 엔진 및 컨테이너에게 현재의 페이지 처리와 관련된 정보를 전달하는 목적으로 활용한다.

<%@ 와 %> 사이에 코드를 위치하여 사용한다.


1
<%@page contentType="text/html;charset=utf-8"%>





- 스크립트릿 (Scriptlet)


JSP가 강력한 이유이다. JSP 페이지 내에 Java 코드를 넣을 수 있다.

<% 와 %> 사이에 코드를 위치하여 사용한다.


1
2
3
4
5
<%
    for (int i=0; i<=10; i++) {
        out.println(i+"<bt/>");
    }
%>





- 표현식 (Expression)


간단한 데이터를 출력하기 위해 사용한다.

<%= 와 %> 사이에 코드를 위치하여 사용한다.


1
<%= result%>





- 선언 (Declaration)


JSP 페이지 전체에서 사용할 변수나 메소드 등을 선언한다.

<%! 와 %> 사이에 코드를 위치하여 사용한다.


1
2
3
4
5
6
<%!
    String text = "Hello World";
    public boolean isExist() {
        return true;
    }
%>





- 주석


코드 상에 설명을 덧붙이기 위해 사용한다.

<%-- 와 --%> 사이에 설명을 쓴다.


1
<%-- Comment --%>



[C] call by value & call by reference

Language/C

함수를 호출할때 매개변수의 형태에 따라 call by value(값에 의한 호출)와 call by reference(참조에 의한 호출) 두가지의 방식이 있다.

두방식의 차이에 대해 알아보자.




- call by value


call by value는 값에 의한 호출로 매개변수에 값을 복사해 넘겨주는 방식이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int square(int num)
{
    return num*num;
}
 
int main()
{
    int n = 10;
    printf("%d\n", n);

    n = square(n);
    printf("%d\n", n);

    return 0;
}



위의 예제에서처럼 call by value는 매개변수에 값을 복사해서 전달해야되기 때문에 인자를 넘겨줄 때 마다 메모리 공간을 할당해 비용이 발생한다는 단점이 있다.

단, 원본의 값이 변경될 가능성이 없다는 장점을 가지고 있다.



- call by reference


call by reference는 참조에 의한 호출로 값을 복사하지 않고, 주소값을 인자로 전달하는 방식이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
void square(int *num)
{
    *num = (*num)*(*num);
}
 
int main()
{
    int n = 10;
    printf("%d\n", n);

    square(&n);
    printf("%d\n", n);

    return 0;
}



위의 예제에서 처럼 call by reference는 매개변수에 값을 복사하지 않고, 주소값을 인자로 전달해 call by value의 고비용 문제를 해결하였다.

단, call by value와 반대로 원본의 값이 변경될 가능성이 있다는 단점을 가지고 있다.