웹 애플리케이션

  • 웹을 기반으로 실행되는 프로그램을 말한다.
  • 웹 프로그래밍을 한다는 것은 웹 애플리케이션을 구현한다는 것을 의미한다.

웹 애플리케이션 동작 원리

  • 클라이언트(사용자, 웹 브라우저)가 서버에 요청을 보내고 서버가 해당 요청에 대해 응답하는 것이 기본 동작이다.
  • 보통 클라이언트는 크롬, 익스플로러 등의 웹 브라우저를 지칭한다.
  • 사용자는 자신이 사용하는 웹 브라우저를 이용하여 인터넷 서핑 등을 할 때, 실제로는 웹 브라우저가 지속적으로 해당 웹 페이지의 서버에 요청을 보내고 응답을 받는 과정이 일어난다.
  • 즉, 사용자와 웹 브라우저는 클라이언트가 되어 서버에 서비스를 요청하고, 서버는 해당 요청에 대해 응답하여 서비스를 제공해주고 웹 브라우저 화면에 결과를 출력하는 것이 웹 애플리케이션 동작 원리이다.
  • 서버 측에서는 웹 서버가 최초의 요청과 최종적인 응답을 담당한다.
  • 먼저 웹 서버가 요청을 받으면 WAS서버(웹 애플리케이션 서버, Web Application Server)에서 다양한 로직이나 데이터베이스와의 연동을 통해서 완성된 결과물만 응답한다.
  • WAS 서버는 데이터베이스 연동이 필요할 경우 데이터베이스 서버와 연동하여 데이터를 가져와 처리한다.



웹 애플리케이션 구성 요소

구성 요소 설명

웹 브라우저

  • 사용자(클라이언트)가 요청한 웹 서버의 결과를 화면에 출력해 보여주는 애플리케이션이다.

웹 서버

  • 웹 브라우저의 요청을 받아 들여서 이에 알맞은 결과를 웹 브라우저에 응답해 주는 역할을 한다.
  • 정적인 페이지를 처리를 담당한다.
  • 요청에 필요한 페이지의 로직이나 데이터베이스와의 연동을 위해서 애플리케이션 서버에 이들의 처리를 요청한다
  • 대표적인 웹 서버의 종류로는 아파치(Apache)와 IIS(Internet Information Server)가 있다.

웹 애플리케이션 서버
(WAS, Web Application Server)

  • 요청한 페이지의 로직이나 데이터베이스와의 연동을 처리하는 부분이다.
  • 동적인 페이지 처리를 담당한다.
  • 대표적인 WAS로는 아파치 톰캣(Tomcat), BEA사의 웹로직(WebLogic), IBM의 웹스파이어(WebSphere), SUN사의 iPlanet, Oracle 9iAS, 국산으로는 제우스(jeus) 등이 있다.

데이터베이스

  • 데이터 정보를 저장하는 곳이다.
  • 웹 서버는 동적인 컨텐츠 생성, 서버 상에 데이터 저장을 하지 못한다.
  • 이러한 기능을 수행하기 위해 도우미 애플리케이션이 필요하다.


'프로그래밍' 카테고리의 다른 글

프로그래머 10계명  (0) 2015.06.09

본 내용은 2가지 책의 내용을 요약한 것입니다. 참고하세요





  


"특히 프로젝트가 서쪽으로 간 까닭은" 은 꼭한번 읽어보시라고 권해드립니다.


  • 리더가 당신에게 무엇을 하고 있는지 묻기 전에 어떤 일을 하고 있는지 먼저 말해 주는 것에 주저하면 안됩니다. 자주 피드백 합시다.
  • 모형, 프로토타입, 스토리보드를 고객에게 미리 제공하여 고객이 원하는 바를 조기에 파악해야 합니다. - 밀짚 인형 기법
  • 업무에 우선 순위를 매긴 후 최고 속력으로 처리가 가능한 만큼만 진행 합니다.
  • 특정 분야에 전문가가 되기 위해서 10년 법칙 1만 시간의 노력이 필요 합니다.
  • 기술적 숙련도에 도움이 되는 수요조사
    • 직원 공모 또는 취업 사이트를 분석하면 유망한 기술을 분석할 수 있습니다.
    • 해외 외주 사이트를 분석하면 유망 기술 동향을 분석할 수 있습니다. - oDesk
  • 업무와 관련된 잡지를 정기 구독 합니다. - 마이크로소프트웨어
    • 과 월호를 찾아봅니다. 정독합시다.
    • 뉴스, 특집기사 등을 주의해서 봅니다.
  • 자신의 업무에 익숙해지기 위한 반복 학습을 실행 합니다.
  • 정상을 바라보고 프로젝트 목표를 설정합니다.
  • 적정한 기간 내에 출시 할 결과물을 계획합니다.
  • 모니터를 여러 대 추가하고, 모니터의 적당한 높이 조절을 통하여 생산성을 향상시켜보도록 합니다.
  • 인체 공학적인 마우스를 이용합니다.
  • 다육이 화분을 책상 주변에 배치 합니다. - 공기 정화
  • 좋아하는 글귀와 명언을 출력하여 붙여 놓습니다.
  • 감탄을 잘합시다. - 리 액션
  • 단위 시간당 더 많은 깨달음의 순간을 경험하도록 통찰력을 키우도록 합니다.
  • 내가 할 일에 대한 목록을 정리 합니다.
    • 우선순위를 수시로 변경하도록 합니다.
    • 중요도 순으로 정리합니다.
  • 자신이 사랑하는 일을 합니다
    • 행복을 찾아라
    • 배울 수 있는 건 뭐든 배워라
    • 새로운 것을 시도하고 옛 것을 지켜라
    • 최고의 사람과 함께
    • 조언자를 찾아라
    • 자기 팀, 회사, 분야에 보답하라
    • 글쓰기, 코딩을 꾸준히 연습하라, 동료의 일 조언
    • 좋은 책을 많이 읽어라
  • 개발자로서의 첫 5년이 가장 큰 가르침을 얻는 시기입니다.
    • 한 팀의 일원으로 일하고, 동료와 정보 기술, 자산(문서, 코드, 프레젠테이션)의 공유 방법을 익힙니다.
  • 중요한 스킬을 익힙니다.
    • 4가지 이상의 언어 및 방법론
    • 람다식, 클로저등 함수형 언어 익히기
    • Jpeg. Xml, Text, Json
    • 동시에 천 명 이상 접속 가능한 서버 기술
    • 여러 명의 개발자와의 팀워크 경험
    • 다른 사람의 소스코드 분석 노하우
    • 다국어 지원 방법
  • 도메인 특성에 집중 합니다.
    • 트랜드 기술 보다 통신, 이미지 처리, 데이터베이스, 그래픽스, 알고리즘 등 기본적인 기술 원칙에 치중
  • 메이븐이 됩시다.
    • 특정 분야에 대해 방대한 지식을 갖추고 있으면서, 그 정보를 널리 공유하는 사람
  • 온라인 멘토가 됩시다.
    • 메신저, 화상 회의 등의 방법으로 정보 공유
    • 지속적인 노하우의 제공
    • 블로그, SNS의 적절한 활용
  • 비밀실험, 전혀 다른 프로젝트를 경험해봅니다.
  • 스스로 특허를 발굴 해보기
  • 전문지에 기고할 글, 백서, 기술 문서 쓰기
  • 논문 쓰기
  • 부하직원의 양성, 차세대 리더의 양성
  • 자신이 개발한 기술에 대한 유튜브 동영상을 제작하여 쇼 케이스 만들기
  • 다양한 업무 역량 배우기
    • 계획
    • 설계 기법
    • 프로그래밍
    • 디버깅
    • 테스팅
    • 공학
  • 업무 외 역량 익히기
    • 강연 능력
    • 조직 예절
    • 협상력
    • 멘토링
    • 팀워크
    • 의사 소통
    • 관리 방법
    • 리더쉽
  • Assertion의 활용
    •  논리 흐름상 반드시 만족해야 하는 과정을 코드에 넣는 것
  • 사분면 기법을 통한 업무의 관리
    • 한 축 : 급한 일 / 급하지 않은 일
    • 한 축 : 중요한 일 / 중요하지 않은 일
    • 중요성 축, 긴급성 축으로 구성
  • 감성지능의 키우기
    • 미소, 인간미, 지지 기반
    • 화를 내는 빈도를 줄입시다.
    • 객관적인 시선
    • 팀의 최선, 온화, 자기 계발
    • 긍정적인 정서
  • 소통 하기
    • 모임, 학회 참석
    • 커뮤니티 활동
  • 다른 사람들에게 대가를 바라지 않는 호의를 베풀기
  • 때론 업무 시간의 빈둥거림도 필요합니다.
    • 뉴스, 웹 서핑, 재테크
    • 게임, 안부 묻기
    • 휴식, 산책
  • IT 관련 동향 따라가기
    • Techmeme
    • Hacker News
    • Reddit Programming
    • 블로터
  • 다른 사람과 협업 하는 것은 그 노력에 숨어있는 집단지성을 증가시킵니다.
  • 팀의 상호작용과 협업을 위한 요소
    • 겸손 : 열려 있어야 한다.
    • 존중 : 능력과 업적에 감사
    • 신뢰 : 믿음
  • 실패의 경험이 없다면 충분히 혁신적인 사람이 되지 못하거나 위험을 감수하려고 하지 않게 됩니다.
  • 나의 실패를 문서로 만들자
    • 포스트모텀(Postmortem)
    • 회고록 작성
      • 요약
      • 현상의 발견
      • 원인
      • 평가
      • 문제의 해결을 위한 활동
      • 재발방지 기법
      • 배운 점
  • 당신의 약점을 드러내면 드러낼수록 당신은 더 강해집니다.
  • 당신의 팀이 가치 있고 지켜야 하는 문화를 가지는 것이 중요합니다.
  • 업무 외의 자신을 힐링하기 위한 악기를 하나 배워보도록 합시다.

출처: 개발자 자기계발 및 실력향상 노하우, http://futurewavedev.tistory.com/7


'프로그래밍 > 이야기' 카테고리의 다른 글

OAuth 2.0 정리  (0) 2021.04.28
[macOS, 맥OS] jEnv로 자바 환경 세팅  (0) 2020.06.27
글을 안 올리는 이유(변명!?)  (0) 2017.06.14

배열

  • 정의: 같은 타입의데이터를 메모리상에 연속적으로 나열시키고, 각 데이터에 인덱스(index)를 부여해 놓은 자료 구조
  • 인덱스: 첨자값, [](대괄호) 사용
  • 배열은 참조 타입에 속한다.

배열의 선언


/* 대괄호의 위치 차이 */
int[] intArray; // 타입[] 변수(배열명);
int intArray[]; // 타입 변수(배열명)[];

/* null로 초기화 */
String[] stringArray = null;

/* 값 목록을 가진 배열 생성 */
String[] names = { "홍길동", "전지현", "설현", "수지" };
int[] scores = { 80, 90, 95, 99 };

/* new 연산자로 바로 배열 객체 생성 */
double[] doubleArray = new double[5]; // 배열의 길이를 지정한다. (이 때 인덱스는 0~4)

/* 컴파일 에러 */
String[] names = null;
// names = { "홍길동", "전지현", "설현", "수지 }; -> 배열 변수 선언 후 중괄호를 사용한 배열 생성은 에러 발생
names = new String[] { "홍길동", "전지현", "설현", "수지 };


  • 중괄호{}는 주어진 값들을 가진 배열 객체를 힙(heap) 메모리 영역에 생성하고, 배열 객체의 번지(주소)를 리턴한다.
  • 배열 변수는 리턴된 번지를 저장하여 참조한다.
  • 위의 예에서 "홍길동"은 names[0] "전지현"은 names[1], 80은 scores[0] 이다.

배열의 값 바꾸기


String[] names = { "홍길동", "전지현", "설현", "수지" };
System.out.println("names[0] > " + names[0]); // 홍길동
names[0] = "에일리";
System.out.println("names[0] > " + names[0]); //에일리

  • 배열의 값 바꾸기는 = (대입 연산자)를 사용한다.

배열 길이

  • 배열의 길이: 배열에 저장할 수 있는 전체 항목 수를 말한다.
  • 배열 객체의 length 필드(field)를 읽어야 한다.
  • 필드(field): 객체 내부의 데이터
  • 배열의 마지막 요소의 인덱스는 배열 길이-1이다.

int[]  intArray = {100, 200, 300};
int len = intArray.length;
System.out.println("배열 intArray의 길이는 > " + len);

참조 타입(reference type)

  • 참조 타입의 종류: 배열, 열거, 클래스, 인터페이스

  • 참조 타입 변수는 스택(stack) 영역에 생성되어 힙(heap) 메모리 영역의 번지(주소)를 값으로 갖는다.

  • 주소를 통해 객체를 참조한다는 뜻에서 참조 타입이라고 부른다.

참조 변수의 ==, != 연산

  • 참조 타입 변수들 간의 ==, != 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용된다.

  • 서로 다른 객체를 참조하는 참조 타입 변수들간의 비교는 기본 타입과 다른 결과를 나타낸다.

  • 예)

int x = 3;
int y = 3;
String hello = new String("안녕하세요");
String hi = new String("안녕하세요");

if ( hello == hi ) {
    System.out.println("안녕하세요.");
} else if ( hello != hi) {
    System.out.println("안녕 못해요.");
}

if (x == y) {
   System.out.println("X와 y는 같습니다.");
} else if ( x != y) {
   System.out.println("x와 y는 다릅니다.");
}
  • 출력
  • 안녕 못해요.
    x와 y는 같습니다.
    

참조 타입 변수의 null

  • 참조 타입 변수가 null 값을 가질 경우 참조할 객체가 없으므로 객체는 힙 메모리 영역에 생성되지 않고, 변수만 스택 영역에서 생성되어 null 값을 가진다.
  • 따라서, null 값을 가진 참조 타입 변수의 ==, != 연산은 기본 타입과 동일하다.
  • 참조 타입 변수가 null 값을 가진 상황에서 프로그램을 실행할 경우 (혹은 프로그램 실행 중 참조 타입 변수가 null 값을 가질 경우) NullPointerException 예외가 발생한다.

String 타입

  • 문자열을 저장하는 참조 타입

  • 자바에서 String은 문자열 리터럴이 동일할 경우 객체를 공유하도록 되어 있다. (new 연산자로 새로운 객체를 생성하지 않고 = 대입 연산자로 같은 문자열을 저장할 경우)

  • String 객체의 equals() 메소드를 사용해서 객체에 상관없이 문자열을 비교할 수 있다.

  • 형식

    String x; // 기본값은 null
    x = "hello"; // 선언한 x에 문자열 값을 대입, " " (쌍따옴표) 사용
    String  y = "hello"; // 선언과 동시에 문자열 저장 x == y 는 true
    String  z = new String("hello"); // 새로운 객체 생성, y == z 는 false
    if ( y.equals(z) ) {
       System.out.println("true"); // true 출력
    }



Structured Query Language(SQL)이란?

  • 구조적 쿼리 언어로 데이터베이스에 질의(쿼리)하는 것을 의미한다.

  • SQL을 이용해 단순한 쿼리뿐만 아니라 데이터베이스를 만들거나 제거하고, 데이터베이스 내에 테이블을 삽입, 갱신, 삭제하거나 다양한 운영 작업을 할 수 있기 때문이다. 

  • SQL은 1974년 IBM 연구소에서 발표한 SEQUEL(structured English Query Language)에서 유래한 것으로, 실험적 관계 데이터베이스 시스템인 SYSTEM R의 인터페이스로 설계 구현하였으나 현재 사용중인 DBMS인 DB2와 SQL?DS의 데이터 언어로 사용되고 있다.
  • SQL은 IBM뿐만 아니라 다른 DB에서도 채택하여 SQL을 지원하는 많은 관계 데이터베이스 시스템에 서 사용하고 있다. 현재의 표준인 SQL은 1992년 개정된 것으로 SQL/92 또는 SQL-92, SQL2로 불린다.

SQL 언어의 특징

  • 관계 대수와 관계해석을 기초로 한 고급 데이터 언어
  • 이해하기 쉬운 형태로 표현
  • 대화식 질의어로 사용 가능
  • 데이터 정의, 데이터 조작, 제어기능 제공
  • COBOL, C, PASCAL 등의 언어에 삽입
  • 레코드 집합 단위로 처리
  • 비절차적언어

SQL의 주요 기능

  • data 정의: 저장 데이터의 구조와 데이터 항목들간의 관련성을 정의
  • data 검색: 저장된 데이터를 검색
  • data 조작: 데이터를 삽입, 삭제, 수정
  • 접근 제어: 허가되지 않은 사용자의 사용을 제한
  • data 공유: 동시 사용자들의 사용을 허용/방지
  • 대화식 질의
  • data에 대한 다중 뷰 제공
  • 동적 data 정의

테이블(table)과 뷰(view)

  • SQL은 기본적으로 릴레이션(relation:관계) 즉 테이블을 대상으로 수행되며 테이블에는 기본 테이블(base table)과 뷰(view)가 있다.
  • 기본 테이블은 사용자가 데이터베이스를 생성하는 과정이나 응용 프로그램을 위해 작성하는데 반해, 뷰는 독자적으로 만들어지지 못하고 특정 기본 테이블로 부터 유도되어 만들어 지는 가상 테이블이다. 일반적으로 테이블이라함은 기본 테이블을 의미한다.

PL/SQL과 SQL*Plus

  • PL/SQL이란? : SQL에 Application Logic을 추가하여 확장한 oracle의 절차적인 언어(Procedural Language)를 의미함
  • SQL*Plus이란? : SQL 및 PL/SQL 문장을 인식하고 실행시켜주는 Oracle Tool, 사용자와 물리적 Database 간의 Interface를 담당하는 도구, 즉, DBMS와 user간의 통신수단임

구분

특징

SQL

• 프로그래밍 경험이 적거나 전혀 없는 사용자들도 사용

• 비 절차적 언어

• 시스템을 생성하고 유지 관리하기 위해 요구되는 시간을 절약

• 영어와 유사한 언어

PL/SQL

• SQL 데이터 조작과 질의 명령문은 절차적인 code 단위 안에 포함

• error 처리 가능 이식성

• 데이터 캡슐화, 정보 숨김, 객체지향 같은 현대적 소프트웨어 엔제니어링 기능을 제공하여Oracle server와 Tool set에 대한 최신식의 프로그래밍을 가는케함

SQL*Plus

• 파일로부터 SQL 입력을 받음

• SQL 문장을 수정하기 위한 line 편집을 제공

• 환경적인 설정을 제어

• 질의 결과를 기본적인 레포트 형태로 format

• Local과 Remote DATABASE를 access


SQL 문장 종류

QUERY

=DQL(Data Query Language)

• DB에서 원하는 데이터의 검색

SELECT

DDL

(Data Definition Language)

• 데이터 구조의 생성, 변경, 제거

CREATE

DROP

ALTER

DML

(Data Manipulation Language)

• 테이블에 새로운 행의 삽입, 삭제, 수정

• 데이터베이스 객체 이름 변경

• 데이터 및 저장공간 회수

INSERT

DELETE

UPDATE

RENAME

TRUNCATE

DCL

(Data Control Language)

• DB와 구조에서 접근 권한의 부여와 제거

GRANT

REVOKE

TCL

(Transaction Control Language)

• DML에 의한 변경을 관리

COMMIT

ROLLBACK

SAVEPOINT


SQL 문장 작성법

  • SQL 문장은 대소문자를 구별하지 않는다.
  • SQL*Plus에서 SQL 문장은 SQL 프롬프트에 입력되며, 이후의 Line은 줄번호가 붙는다.
  • SQL 명령을 종료할 때는 세미콜론(;)을 반드시 붙여야 한다.
  • 맨 마지막 명령어 1개가 SQL buffer에 저장된다.
  • SQL 문장은 한 줄 이상일 수 있다.
  • SQL 명령어를 구성하고 있는 단어중 어디에서나 분리해도 된다.
  • 한 개의 line에 한 개의 절(select, from, where) 형태로 나누어 입력하는 것을 권한다.그러나 한 개의 단어를 두 줄로 나누어 입력해서는 안된다.
  • keyword는 대문자로 입력하도록 권한다.
  • 다른 모든 단어 즉, table 이름, column 이름은 소문자로 입력을 권한다.
  • keyword는 단축하거나 줄로 나누어 쓸 수 없다.
  • 절은 대개 줄을 나누어 쓰도고 권한다.
  • 탭과 줄 넣기는 읽기 쉽게 하기 위해 사용을 권한다.


JVM 구조

  • 실행될 클래스 파일을 메모리에 로드 후 초기화 작업 수행

  • 메소드와 클래스변수들을 해당 메모리 영역애 배치

  • 클래스로드가 끝난 후 JVM은 main 메소드를 찾아 지역변수, 객체변수, 참조변수를 스택에 쌓음
  • 다음 라인을 진행하면서 상황에 맞는 작업 수행(함수 호출, 객체 할당 등)

자바 메모리 구조



  • Class Loader: JVM내로 클래스를 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈로써 런타임시 동적으로 클래스를 로드한다.
  • Execution Engine: Class Loader를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트 코드를 실행한다. 이 때, Execution Engine은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.
  • Garbage Collector: JVM은 Garbage Collector를 통해 메모리 관리 기능을 자동으로 수행한다. 애플리케이션이 생성한 객체의 생존 여부를 판단하여 더 이상 사용되지 않는 객체를 해제하는 방식으로 메모리를 자동 관리한다.
  • Runtime Data Areas: JVM이 운영체제 위에서 실행되면서 할당받는 메모리 영역이다. Class Loader에서 준비한 데이터들을 보관하는 저장소이다.

Runtime Data Areas


Runtime Data Areas & Heap Area



  • Method (Static) Area: JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 생성자와 메소드를 저장하는 공간이다.
  • Runtime Constant Pool
    • 메소드 영역에 포함되지만 독자적 중요성이 있다.
    • 클래스 파일 constant_pool 테이블에 해당하는 영역이다.
    • 클래스와 인터페이스 상수, 메소드와 필드에 대한 모든 레퍼런스를 저장한다.
    • JVM은 런타임 상수 풀을 통해 해당 메소드나 필드의 실제 메모리 상 주소를 찾아 참조한다
  • 메소드 영역/런타임 상수 풀의 사용기간 및 스레드 공유 범위
    • JVM 시작시 생성
    • 프로그램 종료 시까지
    • 명시적으로 null 선언 시
    • 구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있다.
    • 모든 스레드에서 공유한다.
  • Heap Area
    • JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.
    • New 연산자로 생성된 객체 또는 객체(인스턴스)와 배열을 저장한다.
    • 힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
    • 참조하는 변수나 필드가 없다면 의미 없는 객체가 되어 GC의 대상이 된다.
    • 힙 영역의 사용기간 및 스레드 공유 범위
      • 객체가 더 이상 사용되지 않거나 명시적으로 null 선언 시
      • GC(Garbage Collection) 대상
      • 구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있다.
      • 모든 스레드에서 공유한다.
  • Stack Area
    • 각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 할당된다.
    • 메소드를 호출할 때마다 프레임(Frame)을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다.
    • 선입후출(FILO, First In Last Out) 구조로 push와 pop 기능 사용
    • 메소드 호출 시 생성되는 스레드 수행정보를 기록하는 Frame을 저장
    • 메소드 정보, 지역변수, 매개변수, 연산 중 발생하는 임시 데이터 저장
    • 기본(원시)타입 변수는 스택 영역에 직접 값을 가진다.
    • 참조타임 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다.
  • PC Register
    • 현재 수행 중인 JVM 명령 주소를 갖는다.
    • 프로그램 실행은 CPU에서 인스트럭션(Instruction)을 수행.
    • CPU는 인스트럭션을 수행하는 동안 필요한 정보를 CPU 내 기억장치인 레지스터에 저장한다.
    • 연산 결곽값을 메모리에 전달하기 전 저장하는 CPU 내의 기억장치
  • Native Method Stack Area
    • 자바 외 언어로 작성된 네이티브 코드를 위한 Stack이다.
    • 즉, JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 스택이다.
    • 네이티브 메소드의 매개변수, 지역변수 등을 바이트 코드로 저장한다.

Heap Area

  • Young Generation: 이 영역은 자바 객체가 생성되자마자 저장되고, 생긴지 얼마 안되는 객체가 저장되는 공간이다. 시간이 지나 우선순위가 낮아지면 Old 영역으로 옮겨진다. 이 영역에서 객체가 사라질 때 Minor GC가 발생한다.
  • Old(Tenured) Generation: Young Generation 영역에서 저장되었던 객체 중에 오래된 객체가 이동되어 저장되는 영역이다. 이 영역에서 객체가 사라질 때 Major GC(Full GC)가 발생한다.

None Heap Area

  • Permanent Generation(Java 7 이전): 클래스 로더에 의해 로드되는 클래스, 메소드 등에 대한 메타 정보가 저장되는 영역으로 JVM에 의해 사용된다. 리플렉션을 사용하여 동적으로 클래스가 로딩되는 경우에 사용된다. 내부적으로 리플렉션 기능을 자주 사용하는 Spring Framework를 이용할 경우 이 영역에 대한 고려가 필요하다. 런타임시 사이즈를 조절할 수 없어 OutOfMemoryError: PermGen Space error 가 발생하는 메모리 영역이다. JVM 실행시 PermSize와 MaxPermSize 옵션을 사용한다.
  • Metaspace(Java 8 이후): Permanent Generation이 Metaspace로 변경 되었다. 기능은 비슷하지만, 주요 차이점은 동적으로 사이즈를 바꿀 수 있다. JVM 옵션도 PermGem관련하여 사라지고, Metaspace 관련하여 MetaspaceSize 및 MaxMEtaspaceSize 옵션이 새로 생겼다.

참고자료


수정이력

  • 2019-05-07: Permanent Generation None Heap Area로 재분류 및 설명 추가, Meataspace 추가

반복문

  • 어떤 작업이 반복적으로 수행되도록 할 때 사용되는 구문

반복문의 종류

  • for문: 주로 반복횟수를 알고 있을 때 사용
  • 향상된 for문: 컬렉션과 배열을 처리할 때 더 효과적인 문법으로 JDK5.0 이후에 사용 가능
  • while문: 조건식으로 반복할 때 주로 사용
  • do-while문: 반복하기 전에 먼저 실행해야 하는 구문이 있을 때 사용

for문

  • for문 선언 형식
  • for( 초기식; 조건식; 증감식) {
      // 명령코딩
    }
    
  • 예제: 1부터 10까지의 합
  • public class ExFor {
    	public static void main (String[] args)
    	{
    		int i , sum = 0;   
            for ( i=1 ; i<=10 ;  i++) {
            	System.out.printf(i==10?"%d":"%d+",i);
    			sum+= i;    
    		}
            System.out.println("="+sum);
    	}
    }
    
    1+2+3+4+5+6+7+8+9+10=55
    

향상된 for문

  • 향상된 for문 선언 형식
  • for( 자료형  변수명 : 배열 또는 컬렉션 ) {
     // 명령코딩
    }
    
  • 예제: 배열에 담긴 국어 점수 출력
  • public class ExEnhancedFor
    {
    	public static void main (String[] args)
    	{
    		int [] kors = new int[5];
    		kors[0] = 100;
    		kors[1] = 90;
    		kors[2] = 77;
    		kors[3] = 23;
    		kors[4] = 88;
    		
    		for (int kor : kors) {
    			System.out.println(kor);
    		}
    	}
    }
    
    100
    90
    77
    23
    88
    

while문

  • while문 선언 형식
  • while( 조건식 ) {
     // 조건식이 참일 동안 반복될 명령 코딩
    }
    
  • 예제: 10부터 0까지의 합
  • public class ExWhile
    {
    	public static void main (String[] args)
    	{
    		int i = 10 , sum = 0;
    		while( i >= 0 ){
    			System.out.printf(i==0?"%d":"%d+",i);
    			sum += i; 
    			i--;
    		}
    		System.out.println("="+sum); 
    	}
    }
    
    10+9+8+7+6+5+4+3+2+1+0=55
    

do-while문

  • do-while문 선언 형식
  • do{
    // 먼저 한번 실행하고, 조건식이 참일 동안 반복할 명령 코딩
    }while( 조건식 );
    
  • 예제: 증가치에 따라 증가하는 항 값의 누적 합
  • public class ExDoWhile
    {
    	public static void main (String[] args) throws java.lang.Exception
    	{
    		int h = 1; // n 항의 누적 합
    		int n = 1; // 각 항: [1]+[2]+[4]+[7]+[11]+[16]+[22]
    		int k = 0; // 증가치:   1   2   3   4    5    6
     
    		do{
    			k+=1;
    			n += k;
    			if( n > 100) break;
    			h += n; // (누적)
    			System.out.printf("%d - %d - %d\n",n,k,h);
    		}while(true);	
    	}
    }
    
    2 - 1 - 3
    4 - 2 - 7
    7 - 3 - 14
    11 - 4 - 25
    16 - 5 - 41
    22 - 6 - 63
    29 - 7 - 92
    37 - 8 - 129
    46 - 9 - 175
    56 - 10 - 231
    67 - 11 - 298
    79 - 12 - 377
    92 - 13 - 469
    

제어문(Control Flow Statement)

  • 제어문이란, 프로그램 실행 흐름을 개발자가 원하는 방향으로 바꿀 수 있도록 해주는 것이다.
  • 일반적으로 조건식과 실행 구문인 중괄호(블록, { })으로 구성되어 있다.

제어문의 종류

  • 조건문(decision-making statements): if문, switch문
  • 반복문(looping statements): for문, while문
  • 분기문(branching statements): break, continue, return

조건문-if문

  • 조건식의 결과에 따라 블록 실행여부가 결정
  • 조건식에는 boolean 변수 또는 true/false 값을 산출하는 연산식
  • 조건식이 true이면 블록 실행, false이면 실행하지 않음

if문 종류

  • if문
  • if(조건식) {
    
     // 조건식이 참일 경우 실행 구문
    
    }
    
    • 조건식의 결과에 따라 블록 실행여부가 결정
    • 조건식에는 boolean 변수 또는 true/false 값을 산출하는 연산식
    • 조건식이 true이면 블록 실행, false이면 실행하지 않음
  • if-else문
  • if(조건식) {
    
     // 조건식이 참일 경우 실행 구문
    
    }else {
    
     // if문의 조건식이 거짓일 경우 실행 구문
    
    }
    
    • if문이 false일 경우 else 문으로 넘어감
    • 조건식의 결과에 따라 이 두 개의 블록 중 한 블록만 실행 후 if문을 벗어남
  • if-else if-else문
  • if(조건식A) {
    
     // 조건식A가 참일 경우 실행 구문
    
    } else if(조건식B) {
    
    // 조건식A가 거짓이고, 조건식B가 참일 경우 실행 구문
    
    } else if(조건식C) {
    
    // 조건식A, B가 거짓이고, 조건식C가 참일 경우 실행 구문
    
    } else {
    
    // 모든 조건식이 거짓일 경우 실행 구문
    
    }
    
    • 조건문이 여러 개인 다중 if문
    • if 블록 끝에 else if문을 통해 false 일 경우 계속 다음 else if 문으로 넘어감
    • else if문의 수는 제한이 없다
    • 여러 개의 조건식 중 true가 되는 블록만 실행하고 전체 if문을 벗어남
  • 중첩 if문
  • if(조건식 A) {
         // 조건식 A가 참일 경우 실행 구문
         if(조건식 B) {
                    // 조건식 A와 B가 참일 경우 실행 구문
         }
    }
    
    • if문 블록 내에 또 다른 if문을 사용하는 것
    • 중첩의 단계는 제한이 없어 실행흐름을 잘 판단하여 작성
  • 참고: Oracle JAVA Documentation에서는 if-then (=if)문과 if-then-else(if-else문과 if-else if-else문)문 두개로 나눈다. (여기서는 if-else문 설명을 위해 좀더 자세히 분류했다.)

switch문

  • if문과 달리 변수가 어떤 값을 갖느냐에 따라 실행문이 선택
  • if문의 경우의 수가 많아질 수록 switch 문을 사용하는 것이 효과적
  • 괄호 안의 동일한 값을 갖는 case로 가서 실행문을 실행
  • 동일한 값의 case가 없으면 default로 가서 실행문 실행(생략 가능)
  • 변수 값에 따라 case가 실행된 후 제어문을 빠져나가기 위해 break; 사용

형식

switch(변수) {
	case 값1:
		실행문;
		break;
	case 값2:
		실행문;
		break;
	default: // 생략 가능
		실행문;
		break;
}

데이터를 저장하는 방법

데이터를 프로그램 내부에서 저장하는 방법

  • 프로그램 내부에 데이터 정의와 데이터 값을 모두 포함하는 경우
  • 데이터를 프로그램의 변수에 치환하여 저장하는 방법
  • 문제점
    • 새로운 데이터를 추가할 때마다 프로그램을 수정하고 다시 컴파일 해야 한다.
    • 데이터베이스의 특징인 '계속적인 변화'에 맞지 않다.

파일 시스템을 사용하는 방법

  • 프로그램 내부에 데이터 정의만 포함하고 데이터 값은 별도의 파일에 저장하는 경우
  • 데이터를 프로그램과 분리하여 별도의 파일에 저장하는 방법
  • 문제점
    • 데이터 구조가 바뀔 때 프로그램을 수정하고 다시 컴파일 해야 한다.
    • 같은 파일을 두 개의 프로그램이 공유한다.
    • 데이터베이스의 특징인 '동시 공유'가 불가능하다

DBMS를 사용하는 방법

  • 데이터의 정의와 데이터의 값을 DBMS 소프트웨어가 관리하는 방법으로 앞선 방법들의 문제점을 모두 해결할 수 있다.

파일 시스템과 DBMS의 비교

구분

파일 시스템

DBMS

데이터 정의 저장

데이터 정의: 응용 프로그램
데이터
저장: 파일 시스템

데이터 정의: DBMS
데이터 저장: 데이터베이스

데이터 접근 방법

응용 프로그램이 파일에 직접 접근

응용 프로그램이 DBMS 파일 접근을 요청

사용 언어

자바, C++, C

자바, C++, C 등과 SQL

CPU/주기억장치 사용

많음

적음


DBMS의 장점

구분

파일 시스템

DBMS

데이터 중복

데이터를 파일 단위로 저장하므로 중복 가능

DBMS 이용하여 데이터를 공유하기 때문에 중복 가능성 낮음

데이터 일관성

데이터가 중복 저장되어 일관성이 결여됨

중복 제거로 데이터의 일관성이 유지됨

데이터 독립성

데이터 정의와 프로그램의 독립성 유지 불가능

데이터 정의와 프로그램의 독립성 유지 가능

관리 기능

보통

데이터 복구, 보안, 동시성 제어
데이터
관리 기능 등을 수행

프로그램 개발 생산성

나쁨

짧은 시간에 프로그램을 개발할 있음

기타 장점

보통

데이터 무결성 유지, 데이터 표준 준수 용이



변수

  • 하나의 값을 저장할 수 있는 메모리 공간

변수의 선언

  • 타입 변수이름;
  • 타입은 변수에 저장되는 값의 종류와 범위를 결정지으므로 어떤 값을 변수에 저장할지 생각한 후 타입을 결정해야 한다.
  • 변수 이름은 메모리 주소에 붙여진 이름이다.
  • 프로그램은 변수 이름을 통해 메모리 주소에 접근하고, 그곳에 값을 저장하거나 그곳에 값을 읽는다.
  • 변수 이름은 자바 언어에서 정한 명명규칙을 사용해야 하며, 예약어는 사용할 수 없다.
  • 개발자는 변수 이름을 보고, 변수가 어떤 값을 저장하고 있는지 쉽게 알 수 있도록 의미 잇는 변수 이름을 지어주는 것이 좋다.
 int age; // 정수값을 저장할 수 있는 age 변수 선언
double value; // 실수값을 저장할 수 있는 value 변수 선언


변수 명명 규칙

작성 규칙

번째 글자는 문자이거나 $, _ 이어야 하고 숫자로 시작할 없다(필수)

가능: price, $price, _companyName

불가: 1v, @speed, $#value

영어 대소문자가 구분된다(필수)

firstname firstName 다른 변수

문자는 영어 소문자로 시작하되, 다른 단어가 붙을 경우 문자를 대문자로 한다

maxSpeed, firstName, carBodyColor

문자 (길이) 제한은 없다

 

자바 예약어는 사용할 없다(필수)

 



자바 예약어

분류

예약어

기본 데이터 타입

boolean, byte, char, short, int, long, float, double

접근 지정자

private, protected, public

클래스와 관련된

class, abstract, interface, extends, implements, enum

객체와 관련된

new, instanceof, this, super, null

메소드와 관련된

void, return

제어문과 관련된

if, else, switch, case, default, for, do, while, break, continue

논리값

true, false

예외 처리와 관련된

try, catch, finally, throw, throws

기타

transient, volatile, package, import, synchronized, native, final, static, strictfp, assert



변수의 범위

  • 변수는 선언된 { } (블록) 안에서만 사용 가능하다.
  • 클래스 블록안에 바로 선언된 변수를 전역 변수라고 한다.
  • 메소드(함수) 내에 선언된 변수를 지역 변수(local variable)
  • 변수는 선언된 블록 안에서만 사용 할 수 있다.
  • 엄밀히 말하면, 전역 변수는 인스턴스 변수와 클래스 변수로 구분할 수 있는데, 이는 추후 클래스를 다룰 때 더 자세히 설명하겠다.

+ Recent posts