본문 바로가기
Study

[스터디] 자바와 절차적/구조적 프로그래밍

by DuncanKim 2022. 7. 13.
728x90

[스터디] 자바와 절차적/구조적 프로그래밍

 

5주간 <<스프링 입문을 위한 자바 객체 지향의 원리와 이해>>라는 책을 가지고 스터디를 진행하게 되었다.

기본적인 자바 사용법을 알고 있지만, 객체 지향의 개념이라던지, 디자인 패턴이라던지 하는 것이 와닿지 않고 실제 프로그램의 코드를 계획하고 직접 쓸 때 전반적인 개념을 활용하지 못하는 사람에게 적절한 책이다.

 

1장은 서문과 같은 느낌이다. 다만, 좀 더 상세한 부분이 있다. 이번 글에서는 2장 절차적/구조적 프로그래밍을 중심으로 다룰 예정이지만, 짤막하게 정리하고 넘어가고자 한다.

 

 

1. 1장 간략 정리

 

1) 기술의 발전사

 

기술은 사람이 필요한 것들을 품으면서 발전해왔다.

기계어에서 어셈블리어, 어셈블리어에서 C언어 계열, C언어에서 C++, C++에서 Java

여기에 빠진 언어들이 있겠지만 대표적인 언어들로 하자면 그렇다.

 

그 시대의 개발자들의 욕구와 열망을 해소시켜주기 위해 다음 턴으로 하나씩 넘어간 것이다.

정말 010101에서 인간의 언어로 프로그래밍할 수 있는 어셈블리어로

소스파일이 기종마다 하나씩 필요했던 어셈블리어에서 소스 파일이 하나만 있으면 되는 C언어로

절차적 구조적 프로그래밍만 할 수 있는 C언어에서 객체 지향 프로그래밍을 할 수 있는 C++로

기종별 컴파일러의 문제를 해결하면서, 객체 지향 프로그래밍을 할 수 있는 Java로

 

스프링 프레임워크도 이와 비슷한 이유에서 탄생했을 것이다. 아직은 이해하기 어렵지만, OOP에 관련된 것을 공부하다 보면, 이것이 왜 나왔고, 어디에 쓰이는지, 또 어떻게 쓰는 지를 알 수 있을 것이다.

 

 

2) CBD와 SOA

 

CBD(Component Based Development) : 컴포넌트 기반 개발. 애플리케이션을 의미 있는 단위로 구분하고 하나씩 부품으로 개발하고 그것을 결합해 소프트웨어 제품을 완성하는 방법론.

 

SOA(Service Oriented Architecture) : 서비스 지향 구조. 실제 현실의 업무를 기준으로 개발하자는 사상.

 

둘 다 '개념적'인 것들이다. 방법론이다. 어떤 실체의 무엇이 아니라, 어떤 실체를 개발해내는 방법론이다. 객체지향 하면 C++과 Java가 떠오르지만, CBD, SOA는 무엇이 떠오르지는 않는다. 내가 CBD, SOA 방식으로 개발을 한다면 그 개발품이 CBD, SOA가 되는 것이다. 개념과 방법론에 너무 치우칠 필요가 없다는 말이다.

 

 

3) 스터디를 통해 알아내야 할 세 가지

 

* OOP의 개념

* 자바 언어의 문법

* 자바가 OOP 개념을 구현한 방식

 

 

 

2. 자바와 절차적/구조적 프로그래밍 

 

1) 스택 프레임 다시보기

 

한 달 여의 시간 동안 메모리 안의 구조 속에서 어떤 일이 일어나는 지를 배웠다. 그렇지만, 메서드가 들어갈 때는 항상 시뮬레이션이 헷갈리는데, 여기에서 잡고 가고자 한다.

 

class StackFrame{

    public static void main(String[] args){

        int k = 5;
        int m;

        System.out.println(k);
        if(k == 5){
        	int f = square(k);
        }
        
    }

    private static int square(int k){
        int result;
        k = 25;
        result = k;
        return result;
    }
}

 

이런 코드를 실행한다고 했을 때, 메모리에서는 어떤 일이 일어나는지 영상으로 확인해보자.

 

 

main 스택 프레임 안에 if 스택 프레임이 생기고, square는 별도의 메서드이기 때문에 main 프레임 밖에 스택 프레임이 지어지는 것을 알 수 있다.

 

각자의 쓰임이 끝나면 변수가 먼저 쫓겨나고, 변수마저 없으면 스택 프레임 전체가 쫓겨나게 되고, 마지막 메인 프레임의 args까지 없어지면, 그 프로세스는 종료가 된다.

 

추가적으로 System.out.println의 경우에는 메모리 할당의 개념이 필요가 없다. 어떤 메모리를 저장하지 않고, 바로 값만 GPU에게 전달하고 없어지기 때문이다.

 

 

 

 

2) 멀티스레드와 Static

 

Static 변수를 사용하면, 멀티스레드를 사용할 때 다음과 같은 좋지 않은 점을 만난다.

Static 변수를 '수정'하게 되면, 모든 스레드가 바뀐 값을 공유받게 되는 것이다.

마치 여행 모임 통장을 사용하고 있는데, 누군가가 그 통장의 돈을 빼간다면, 모든 사람이 영향을 받듯 말이다.

(개인통장은 지역변수, 모임통장은 전역 변수, static 변수라고 할 수 있겠다. 나의 통장들이라는 객체를 만들면 나의 카카오 통장이 객체 멤버 변수가 될 수 있을 듯?)

 

멀티 스레드는 스택 영역을 스레드 개수만큼 분할해서 쓰는 것이다.

여기에 유사 개념이 있는데, 멀티 프로세스는 메모리 자체를 분할해서 고유의 스택, 힙, 데이터 메모리 공간을 가지는 것이다.

 

멀티 프로세스는 각자의 메모리 공간이 고유할 수 있도록 나누어져 있어 서로 참조가 불가능하다.

그렇지만, 멀티 스레드의 경우, 스택 영역만 분할하고 static과 heap 영역은 공유해서 사용하는데, thread 각각이 가져야 할 변수를 static으로 선언해서 사용할 경우, 한 thread에서 담아놓은 값이 다른 thread에서 값을 입력받으면서 오염될 수 있다.

 

그렇기 때문에 쓰기 가능한 전역 변수를 사용하지 않아야 된다. 이렇게 되면 thread의 안전성이 깨진다. 멀티 스레드를 사용할 때는 전역 변수 또는 static 변수를 사용하지 말자.

 

 

 

3) 객체 지향 프로그래머가 익혀야 할 절차적 프로그래밍의 기획 방법

 

메서드를 만드는 방법에 있어서는 절차적 프로그래밍의 방법을 따라야 한다. 순서도 또는 의사 코드를 작성하는 것이 좋다. NS 다이어그램을 활용해보는 것도 좋다.

 

플로우 차트와는 다르게 하나의 박스 안에서 무엇인가가 해결되는 것을 볼 수 있다. 조건에 따라 True, False가 되고, 그 결과에 따라 다음 처리를 받게 되는 구조를 나타낼 수 있는 것이다.

 

 

 

728x90

댓글