추상 클래스는 클래스의 구조를 만들기 위한 방법으로 쓰인다. 

추상 클래스는 객체가 가지는 특징을 추상화 한 것일 뿐이다. 

추상 메서드도 마찬가지이다. 

 

추상클래스의 특징

추상 클래스는 자기 이름으로 자신의 객체를 생성할 수 없기 때문에,

추상 클래스를 상속한 자식 클래스의 객체를 생성하여 사용해야 한다.

 

추상 메서드는 반드시 자식클래스에서 오버라이딩하여 구현해야 한다.

그렇지 않으면 자식클래스도 추상 클래스가 된다.

 

 

추상 클래스는 반드시 자식클래스를 가져야 하며,

다음과 같은 경우에 추상클래스가 된다.

 

추상 메서드가 1개 이상 있을 때,

추상 클래스를 상속했지만 추상 메서드를 오버라이딩 하지 않거나,

인터페이스를 구현했지만 메서드를 구현하지 않았을 때,

추상 메서드가 없는데 강제로 상속하여 사용하려는 경우

 

 

 

추상 메서드는 바디({})가 없다.

추상 메서드가 하나라도 있으면 추상클래스가 된다.

 

 

 

 

 

 

 

 

 

 

 

출처 - http://blog.naver.com/k97b1114?Redirect=Log&logNo=140149967452

==========================================================================================

6.1 추상클래스란?

클래스를 설계도에 비유한다면, 추상클래스는 미완성 설계도에 비유할 수 있다. 미완성 설계도란, 단어의 뜻 그대로 완성되지 못한 체로 남겨진 설계도를 말한다. 
클래스가 미완성이라는 것은 멤버의 개수에 관계된 것이 아니라, 단지 미완성 메서드(추상메서드)를 포함하고 있다는 의미이다. 
미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로는 인스턴스는 생성할 수 없다. 추상클래스는 상속을 통해서 자손클래스에 의해서 완성될 수 있다. 

추상클래스 자체로는 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이 되는 조상클래스로서 중요한 의미를 갖는다. 

추상클래스는 키워드 'abstract'를 붙이기만 하면 된다. 이렇게 함으로써 이 클래스를 사용할 때, 클래스 선언부의 abstract를 보고 이 클래스에는 추상메서드가 있으니 상속을 통해서 구현해주어야 한다는 것을 쉽게 알 수 있을 것이다. 

abstract class 클래스이름 { 
     // ... 



추상클래스는 추상메서드를 포함하고 있다는 것을 제외하고는 일반클래스와 전혀 다르지 않다. 추상클래스에도 생성자가 있으며, 멤버변수와 일반 메서드도 가질 수 있다. 
[참고]추상메서드를 포함하고 있지 않은 클래스에도 키워드 'abstract'를 붙여서 추상클래스로 지정할 수도 있다. 추상메서드가 없는 완성된 클래스라 할지라도 추상클래스로 지정되면 클래스의 인스턴스를 생성할 수 없다.


6.2 추상메서드(abstract 메서드)

메서드는 선언부와 구현부(몸통)로 구성되어 있다고 했다. 선언부만 작성하고 구현부는 작성하지 않은 체로 남겨 둔 것이 추상메서드이다. 즉, 설계만 해 놓고 실제 수행될 내용은 작성하지 않기 때문에 미완성 메서드인 것이다. 

메서드를 이와 같이 미완성 상태로 남겨 놓는 이유는 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상클래스에서는 선언부만을 작성하고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려 주고, 실제 내용은 상속받는 클래스에서 구현하도록 비워 두는 것이다. 

그래서, 추상클래스를 상속받는 자손클래스는 조상의 추상메서드를 상황에 맞게 적절히 구현해주어야 한다. 

추상메서드 역시 키워드 'abstract'를 앞에 붙여 주고, 추상메서드는 구현부가 없으므로 괄호{}대신 문장의 끝을 알리는 ';'을 적어준다. 


/* 주석을 통해 어떤 기능을 수행할 목적으로 작성하였는지 설명한다. */ 
abstract 리턴타입 메서드이름(); 


추상클래스로부터 상속받는 자손클래스는 오버라이딩을 통해 조상인 추상클래스의 추상메서드를 모두 구현해주어야 한다. 만일 조상으로부터 상속받은 추상메서드 중 하나라도 구현하지 않는다면, 자손클래스 역시 추상클래스로 지정해 주어야 한다. 
실제 작업내용인 구현부가 없는 메서드가 무슨 의미가 있을까 싶기도 하겠지만, 메서드를 작성할 때 실제 작업내용인 구현부 보다 더 중요한 부분이 선언부이다. 
메서드의 이름과 메서드의 작업에 필요한 매개변수, 그리고 작업의 결과로 어떤 타입의 값을 반환할 것인가를 결정하는 것은 쉽지 않은 일이다. 선언부만 작성해도 메서드의 절반 이상이 완성된 것이라 해도 과언이 아니다. 
메서드를 사용하는 쪽에서는 메서드가 실제로 어떻게 구현되어있는지 보다는 메서드의 이름과 매개변수, 리턴타입, 즉 선언부만 알고 있으면 되므로 내용이 없을 지라도 추상메서드를 사용하는 코드를 작성하는 것이 가능하며, 실제로는 자손클래스에 구현된 완성된 메서드가 호출되도록 할 수 있다. 




6.3 추상클래스의 작성

여러 클래스에 공통적으로 사용될 수 있는 클래스를 바로 작성하기도 하고, 기존의 클래스의 공통적인 부분을 뽑아서 추상클래스로 만들어 상속하도록 하는 경우도 있다. 
참고로 추상의 사전적 정의는 다음과 같다. 


추상[抽象] - 낱낱의 구체적 표상(表象)이나 개념에서 공통된 성질을 뽑아 이를 일반적인 개념으로 파악하는 정신 작용 


상속이 자손클래스를 만드는데 조상클래스를 사용하는 것이라면, 추상화는 기존의 클래스의 공통부분을 뽑아 내서 조상클래스를 만드는 것이라고 할 수 있다. 

추상화를 구체화와 반대되는 의미로 이해하면 보다 쉽게 이해할 수 있을 것이다. 상속계층도를 따라 내려갈 수록 클래스는 점점 기능이 추가되어 구체화의 정도가 심해지며, 상속계층도를 따라 올라갈 수록 클래스는 추상화의 정도가 심해진다고 할 수 있다. 

즉, 상속계층도를 따라 내려 갈수록 세분화되며, 올라갈수록 공통요소만 남게 된다. 


추상화 - 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업 
구체화 - 상속을 통해 클래스를 구현, 확장하는 작업 



여러 클래스에 널리 사용될 수 있는 Player라는 추상클래스를 작성해 보았다. 이 클래스는 VCR이나 Audio와 같은 재생 가능한(Player) 기기를 클래스로 작성할 때, 이 들의 조상클래스로 사용될 수 있을 것이다. 


abstract class Player { 
      boolean pause;             // 일시정지상태를 저장하기 위한 변수 
      int currentPos;             // 현재 Play되고 있는 위치를 저장하기 위한 변수 

      Player() {                   // 추상클래스도 생성자가 있다. 
            pause = false; 
            currentPos = 0; 
      } 
/** 지정된 위치(pos)에서 재생을 시작하는 기능이 수행하도록 작성되어야 한다. */ 
      abstract void play(int pos);       // 추상메서드 
/** 재생을 즉시 멈추는 기능을 수행하도록 작성되어야 한다. */ 
      abstract void stop();             // 추상메서드 

      void play() {             
            play(currentPos);             // 추상메서드를 사용할 수 있다. 
      } 
      void pause() { 
            if(pause) {             // pause가 true일 때(정지상태)에서 pause가 호출되면, 
                  pause = false;             // pause의 상태를 false로 바꾸고, 
                  play(currentPos);             // 현재의 위치에서부터 play를 한다. 
            } else {                   // pause가 false일 때(play상태)에서 pause가 호출되면, 
                  pause = true;             // pause의 상태를 true로 바꾸고 
                  stop();                   // play를 멈춘다. 
            } 
      } 


[참고] /** */ 주석은 javadoc.exe를 사용해서 Java API와 같은 클래스의 멤버에 대한 설명을 담은 문서를 만드는데 사용된다.

이제 Player클래스를 조상으로 하는 CDPlayer 클래스를 만들어 보자. 


class CDPlayer extends Player { 
     // 조상 클래스의 추상메서드를 구현한다. 
      void play(int currentPos) { 
            /* 실제구현 내용 생략 */ 
      } 

      void stop() { 
            /* 실제구현 내용 생략 */ 
      } 

      // CDPlayer클래스에 추가로 정의된 멤버 
      int currentTrack; // 현재 재생 중인 트랙 

      void nextTrack() { 
            currentTrack++; 
            //... 
      } 

      void preTrack() { 
            if(currentTrack > 0) { 
                  currentTrack--; 
            } 
            //... 
      } 



조상클래스의 추상메서드를 CDPlayer클래스의 기능에 맞게 완성해주고, CDPlayer만의 새로운 기능들을 추가하였다. 

사실 Player클래스의 play(int pos)와 stop()을 추상메서드로 하는 대신, 아무 내용도 없는 메서드로 작성할 수도 있다. 아무런 내용도 없이 단지 괄호{}만 있을지라도, 추상메서드가 아닌 일반메서드로 간주되기 때문이다. 


class Player { 
      ... 
      void play(int pos) {} 
      void stop() {} 
      ... 



어차피 자손클래스에서 오버라이딩하여 자신의 클래스에 맞게 구현할 테니 추상메서드로 선언하는 것과 내용없는 빈 몸통만 만들어 놓는 것이나 별 차이가 없어 보인다. 

그래도 굳이 abstract를 붙여서 추상메서드로 선언하는 이유는 자손클래스에서 추상메서드를 반드시 구현하도록 강요하기 위해서이다. 
만일 추상메서드로 정의되어 있지 않고 빈 몸통만 가지도록 정의되어 있다면, 상속받는 자손클래스에서는 이 메서드들이 온전히 구현된 것으로 인식하고 오버라이딩을 통해 자신의 클래스에 맞도록 구현하지 않을 수도 있기 때문이다.
 

하지만 abstract를 사용해서 추상메서드로 정의해놓으면, 자손클래스를 작성할 때 이들이 추상메서드이므로 내용을 새로 구현해주어야 한다는 사실을 인식하고 자신의 클래스에 알맞게 구현할 것이다. 

이번엔 기존의 클래스로부터 공통된 부분을 뽑아 내어 추상클래스를 만들어 보도록 하자. 


class Marine {                   // 보병 
     int x, y;                         // 현재 위치 
     void move(int x, int y) { /* 지정된 위치로 이동 */ } 
     void stop() {       /* 현재 위치에 정지 */ } 
     void stimPack() {       /* 스팀팩을 사용한다.*/


class Tank {                   // 탱크 
     int x, y;                         // 현재 위치 
     void move(int x, int y) { /* 지정된 위치로 이동 */ } 
     void stop() {       /* 현재 위치에 정지 */ } 
     void changeMode() {       /* 공격모드를 변환한다. */


class Dropship {                   // 수송선 
     int x, y;                         // 현재 위치 
     void move(int x, int y) { /* 지정된 위치로 이동 */ } 
     void stop() {       /* 현재 위치에 정지 */ } 
     void load() { /* 선택된 대상을 태운다.*/ } 
     void unload() { /* 선택된 대상을 태운다.*/ } 



유명한 컴퓨터게임인 Starcraft에 나오는 유닛들을 클래스로 간단히 정의해보았다. 이 유닛들은 각자 나름대로의 기능을 가지고 있지만 공통부분을 뽑아 내어 하나의 클래스로 만들고, 이 클래스로부터 상속받도록 변경해보자. 


abstract class Unit { 
     int x, y; 
     abstract void move(int x, int y); 
     void stop() {       /* 현재 위치에 정지 */ } 



class Marine extends Unit {       // 보병 
     void move(int x, int y) { /* 지정된 위치로 이동 */ } 
     void stimPack() {       /* 스팀팩을 사용한다.*/


class Tank extends Unit { // 탱크 
     void move(int x, int y) { /* 지정된 위치로 이동 */ } 
     void changeMode() {       /* 공격모드를 변환한다. */


class Dropship extends Unit { // 수송선 
     void move(int x, int y) { /* 지정된 위치로 이동 */ } 
     void load() { /* 선택된 대상을 태운다.*/ } 
     void unload() { /* 선택된 대상을 내린다.*/ } 



각 클래스의 공통부분을 뽑아 내서 Unit클래스를 정의하고 이로부터 상속받도록 하였다. 이 Unit클래스는 다른 유닛을 위한 클래스를 작성하는데 재활용될 수 있을 것이다. 
이들 클래스에 대해서 stop메서드는 선언부와 구현부 모두 공통적이지만, Marine, Tank는 지상유닛이고 Dropship는 공중유닛이기 때문에 이동하는 방법이 서로 달라서 move메서드의 실제 구현 내용이 다를 것이다. 

그래도 move메서드의 선언부는 같기 때문에 추상메서드로 정의할 수 있다. 최대한의 공통부분을 뽑아 내기 위한 것이기도 하지만, 모든 유닛은 이동할 수 있어야 하기 때문에 Unit클래스에는 move메서드가 반드시 필요한 것이기 때문이다. 
move메서드가 추상메서드로 선언된 것에는, 앞으로 Unit클래스를 상속받아서 작성되는 클래스는 move메서드를 자신의 클래스에 알맞게 반드시 구현해야한다는 의미가 담겨 있는 것이기도 하다. 


Unit[] group = new Unit[5]; 
group[0] = new Marine(); 
group[1] = new Tank(); 
group[2] = new Marine(); 
group[3] = new Dropship(); 
group[4] = new Marine(); 

for(int i=0;i< group.length;i++) { 
      // Unit배열의 모든 유닛을 좌표(100, 200)의 위치로 이동한다. 
     group[i].move(100, 200); 



위의 코드는 공통조상인 Unit클래스 타입의 참조변수 배열을 통해서 서로 다른 종류의 인스턴스를 하나의 묶음으로 다룰 수 있다는 것을 보여 주기 위한 것이다. 
다형성에서 배웠듯이 조상클래스타입의 참조변수로 자손클래스의 인스턴스를 참조하는 것이 가능하기 때문에 이처럼 조상클래스타입의 배열에 자손클래스의 인스턴스를 담을 수 있는 것이다. 

만일 이들 클래스간의 공통조상이 없었다면 이처럼 하나의 배열로 다룰 수 없었을 것이다. Unit클래스에 move메서드가 비록 추상메서드로 정의되어 있다 하더라도 이처럼 Unit클래스 타입의 참조변수로 move메서드를 호출하는 것이 가능하다. 메서드는 참조변수의 타입에 관계없이 실제 인스턴스에 구현된 것이 호출되기 때문이다. 
group[i].move(100, 200)과 같이 호출하는 것이 Unit클래스의 추상메서드인 move를 호출하는 것 같이 보이지만 실제로는 이 추상메서드가 구현된 Marine, Tank, Dropship인스턴스의 메서드가 호출되는 것이다. 

모든 클래스의 조상인 Object클래스 타입의 배열로도 서로 다른 종류의 인스턴스를 하나의 묶음으로 다룰 수 있지만, Object클래스에는 move메서드가 정의되어 있지 않기 때문에 move메서드를 호출하는 부분에서 에러가 발생한다. 


Object[] group = new Object[5]; 
group[0] = new Marine(); 
group[1] = new Tank(); 
group[2] = new Marine(); 
group[3] = new Dropship(); 
group[4] = new Marine(); 

for(int i=0;i < group.length;i++) { 
      // 에러!!! Object클래스에는 move메서드가 정의되어 있지 않다.
     group[i].move(100, 200); 



출처 -  http://cafe.naver.com/javachobostudy

'Development > JavaEssential' 카테고리의 다른 글

패키지(package)  (0) 2012.02.07
인터페이스(Interface)  (0) 2012.01.24
클래스변수 & 인스턴스 변수  (0) 2011.12.28
java - 두 가지 데이터 타입  (0) 2011.09.24
자바 - 타입에 따른 변수의 기본값  (1) 2011.02.12
Posted by linuxism
,

Intel 80286

인텔 80286 1982에 개발된 16비트 개인용 컴퓨터 마이크로프로세서이다. 이전에 쓰이던 8086/8088 프로세서의 16비트 명령어와 호환되며IBM PC/AT(Advanced Technology) 기종에 적용되어 1990년도 초반까지 널리 쓰였다. 클럭속도는 6MHz부터 20MHz에 이르기까지 다양하다.

80286 프로세서는 이전 8086 프로세서에 비해 같은 클럭에서 수행속도가 2배정도 향상되었다. 또한 1MB 주기억장치(RAM) 만을 사용할 수 있었던 8086 프로세서와 달리 16MB까지의 주기억장치를 지원한다. 또한 다중작업(멀티태스킹)을 지원했고, 보호모드를 마련해 이를 지원하는 프로그램의 경우에는 효율적으로 메모리를 사용할 수 있게 했지만 호환 문제로 널리 쓰이지는 않았다.

 

i386(Intel 80386)

인텔 80386(또는 i386) 인텔사에서 1985에 개발한 개인용 컴퓨터 마이크로프로세서이다. x86 CPU 시리즈 중에 가장 처음으로 32비트 아키텍처로 만들어진 이 CPU, 이전 제품인 80286에서 32비트로 확장된 명령어 셋과 강화된 레지스터, 대용량 메모리를 쓰는 프로그램의 지원을 위한 페이징 변환 유닛(paging translation unit) 등이 추가되었다.

이후, 인텔의 32비트 CPU의 기본 바탕이 되는 명령어 세트  컴퓨터 아키텍처(IA-32), 80386을 기준으로 확립되었으며, 80386과 이 CPU의 호환 프로세서들을 집합적으로 x86 또는 i386 아키텍처라고 일컫게 되었다.

한편, 80386 CPU 자체는 개인용 컴퓨터용으로 사용된 시기는 오래전에 끝났으나 인텔 및 다른 업체들을 통해항공우주 공학 등의 임베디드 시스템용으로 계속 생산되어 왔다. 2007 9월을 끝으로 386의 생산이 중단되었다.

 

i486

Intel486 (인텔 연아는 물론 구, i486, 486) 인텔  32 비트 마이크로 프로세서 ( CPU )의 시리즈에서80386 의 후속 제품이다.

1989년에 발매 되기 시작하였다. 원래 명칭은 "Intel 80486"였지만, 후에 염가 판의 "486SX"를 라인업에 추가했을 때 기존의 80486 "486DX "로 개명하고 동시에 그들의 총칭으로서i486 " 상표 를 사용하게되었다인텔이 현재 사용하고있는 명칭은 Intel486 ™ 프로세서 (Intel486 ™ Processor)이다.

 

 

Pentium(i586)

Pentium (펜티엄) 인텔  1993  5 월부터 출하를 시작x86 아키텍처 마이크로 프로세서 ( CPU ) 제품군의 브랜드이다.

Pentium은 회사의 프로세 서인 i486 의 후속 제품이다처음에는 80286 80386, i486 계속 새로운 프로세서의 이름은 "80586"또는 "i586"예상되었지만, 짧은 숫자와 알파벳의 간단한 조합만으로는 상표 로 인정되지 않고, 브랜드로 설정 위해 "5"를 의미하는 그리스어  Penta와 요소를 나타내는 라틴어  ium에서Pentium 이라는 신조어를 만들어 냈다또한 인텔은 Pentium이라는 단어는 형용사 것으로, 광고 활동도Pentium 프로세서 라고 표현하고있다.

인텔은 Pentium 브랜드의 확립에 노력 성공했기 때문에 이에 따르는 몇 가지 후속 프로세서에서 Pentium이라는 단어가 포함된 브랜드를 채용했다.

 

i686

P6 마이크로 아키텍처 (P6 Microarchitecture) 인텔  x86 명령어 세트의 CPU 6 세대 디자인이다IA - 32  4 세대.

P6 마이크로 아키텍처를 최초로 채용한 제품은 1995 년 11  발매되는 Pentium Pro 프로세서2000  까지 인텔의 주력 제품 아키텍처로 사용되었다. 이를 이어 2000년에 넷버스트 마이크로아키텍처가 뒤를 이었다. 그렇지만 이후펜티엄 M 계열의 마이크로프로세서에서 다시 사용되었다. 변형 P6 마이크로아키텍처를 사용한 펜티엄 M의 후속은 코어 마이크로아키텍처이다.

 

x86

x86 또는 80x86  인텔 이 개발한 마이크로 프로세서  아키텍처 이며, 또한 이것을 기반으로 한 AMD등의 호환 제조 업체를 포함한 회사의 마이크로 프로세서 제품의 총칭플랫폼 )이다.

16 비트  8086 이 등장하고 32 비트 확장 80386 를 거쳐 64 비트 확장인 x64  Xeon 또는 Intel Core i7등에 이르기이 기본적인 명령 세트  상위 호환 을 유지하고있다그러나 같은 64 비트에서도 인텔 고유의 IA - 64 는 다른 규격이다.

 

IA-32

IA-32(Intel Architecture, 32-bit) 또는 x86-32 인텔 32비트 마이크로프로세서에서 사용하는 명령 집합 아키텍처이며, 이전에 사용되던 IA-16 아키텍처의 32비트 확장이다. IA-32 x86이라는 이름으로 부르기도 하지만 엄밀하게는 x86 아키텍처 IA-16, IA-32 등을 모두 포함하는 일반적인 이름이다.

 

IA-64

인텔의 IA-64 아키텍처는 이름은 유사하지만 IA-32와 호환되지 않는 완전히 새로운 아키텍처로아이테니엄 계열 프로세서에서 사용되고 있다. IA-64는 비순차적 실행(out-of-order execution) 대신 VLIW 디자인을 채용하였다. 아이테니엄은 IA-32를 하드웨어적으로 지원하기는 하지만, IA-64 IA-32간의 명령어가 호환되지 않기 때문에 상당히 느린 속도로 구현된다.

아이테니엄(Itanium) 2001에 공식 발표된 인텔이 제공하는 64비트 CPU이다휴렛 팩커드(HP)와 공동으로 개발된 높은 성능의 서버 아키텍처인 IA-64를 처음으로 채용하여, HP PA-RISC 프로세서를 대체하거나 인텔의 제온(제온(Xeon) 서버 워크스테이션 인텔 x86 CPU의 브랜드 이름으로 x86 CPU의 수많은 계열을 가리킨다프로세서의 규모로 사용되는 것을 목적으로 한다. 개발이 지연되면서 출시된 최초의 아이테니엄은 2001에 출시되었다. 그 뒤로도 보다 강력한 아이테니엄 프로세서가 정기적으로 발표되었다. 아이테니엄은 2006년에 아이테니엄 2로 자리를 내 주었다.

 

AMD(x86-64)

AMD AMD64(또는 x86-64) 명령 집합은 IA-32와 대부분 호환되면서 64비트 기반으로 옮겨 간 아키텍처이다. AMD64 IA-32에서 아직까지 지원하고 있는 16비트 지원들을 대부분 버렸고, 특히 일반 레지스터들을 어떤 곳에라도 쓸 수 있게 했으며 대부분의 세그먼트 레지스터들을 없앴다. (다만 FS GS는 윈도와의 호환을 위해 남겨졌다) 또한 일반 레지스터와 SSE 레지스터의 수가 각각 8개에서 16개로 늘어났다.

x86-64 x86 명령어 집합 아키텍처 64비트 모임이다. x86-64 명령어 집합은 에뮬레이션 없이 인텔 x86를 지원하며 AMD64로 이름 붙인 AMD에 의해 고안되었다. 이 아키텍처는 인텔 64라는 이름으로 인텔에 의해 복제되기도 했다. (옘힐, 클래카마스 기술, CT, IA-32e, EM64T 등으로 불렸음)[1] 이로써 x86-64 또는 x64의 이름을 일상적으로 사용하기에 이르렀다.

x86-64 인텔의 아이테니엄 계열의 프로세서 아키텍처인 IA-64 헷갈리면 된다.

 

EM64T

2004 2월에 인텔은 EM64T 명령 집합을 발표했다. EM64T AMD64의 구현이며, AMD64와 대부분 호환되지만 몇몇 기능들이 지원되지 않는다. 인텔은 2004년 후반부터 제온 코어에서 이 명령 집합을 사용하기 시작했으며, 데스크톱 시장의 경우 2005 초부터 펜티엄 4에서 지원하기 시작했다.



'System > Common' 카테고리의 다른 글

UNIX  (0) 2012.01.27
System V (시스템 파이브)  (0) 2012.01.27
SPARC Enterprise  (0) 2012.01.19
후지쯔 PRIMEPOWER  (0) 2012.01.19
hostid  (0) 2012.01.18
Posted by linuxism
,

MySQL flush privileges 명령어

INSERT나 UPDATE, DELETE문을 이용해서 MySQL의 사용자를 추가,삭제하거나, 사용자 권한 등을 변경하였을 때, MySQL에 변경사항을 적용하기 위해서 사용하는 명령어가 flush privileges 입니다.

아래는 highbird 데이터베이스에 bird 유저를 추가하는 예제입니다. 끝에 flush privileges 명령어를 사용해서 변경사항을 적용해 주는 것을 확인하실 수 있습니다.



이 flush privileges 는 정확히 말하면 grant 테이블을 reload 함으로 변경사항을 바로 적용해주는 명령어인데, INSERT, UPDATE와 같은 SQL문이 아닌 grant 명령어를 사용해서 사용자를 추가하거나 권한등을 변경하였다면 굳이 실행할 필요가 없습니다.

아래는 grant 명령어를 사용해서 highbird 데이터베이스에 bird 유저를 추가하는 예제입니다.
flush privileges 명령어가 끝에 사용되지 않음을 확인 하실 수 있습니다.



flush privileges 명령어처럼 grant 테이블을 reload 하는 명령어로 mysqladmin reload 나
mysqlamdin flush-privileges 명령어가 있는데 차이라면 "mysqladmin 명령어"이므로 쉘 프롬프트에서 사용하여야 한다는 것과 비밀번호가 있을 경우 마지막 예와 같이 조금 번거로울 수 있다는 것입니다.

[mysql 프롬프트 사용 예]

mysql> flush privileges;


[쉘 프롬프트 사용 예]

[root@mail ~]# mysqladmin reload
[root@mail ~]# mysqladmin flush-privileges


[쉘 프롬프트 비밀번호가 있을 경우 사용 예]

[root@mail ~]# mysqladmin -u root -p reload
Enter password:


출처 -  http://shapeace.tistory.com/99 


Posted by linuxism
,