'C'에 해당되는 글 116건

  1. 2007.11.05 오버라이드와 오버로딩 1 by 청웨일
  2. 2007.11.05 상속 by 청웨일
  3. 2007.11.05 자바 시작하기 by 청웨일
  4. 2007.11.03 파일 시스템 by 청웨일
  5. 2007.11.03 스트림 by 청웨일

오버라이드

메소드는 계약서이다.

오버라이딩 하려면 인자는 같아야 하고 이턴 유형도 호환 가능해야 한다.

오버라이드하는 메소드에서는 인자를 변경할 수 없다.

메소드를 더 접근하기 어렵게 만들면 안된다.(private로 설정하면 안되)

다형성이 작동하려면 하위클래스에서 상위 클래스의 메소드를 쓸때 그 메소드가 제대로 실행되어야 한다.

컴파일러에서 메소드 호출을 허가한 후에도 오버라이드하는 메소드의 인자와 리턴 형식이 같을 때만 그 메소드가 제대로 작동한다.

상위 클래스와 하위클래스의 이름이 같다.

매개변수의 타입과 개수, 순서가 같다.

리턴 타입이 같다.

상속받은 메소드의 내용을 변경할수 있다.


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

class A {

        void Pmethod() { }

}

class a extends A {

        void Pmethod() { }          //오버라이딩

        void Pmethod(int i) { }   //오버로딩

        void Cmethod() { }          //오버로딩

        void Cmethod(int i) { }    //오버로딩

      // 메소드이름이 같아도 매개변수가 달라서 다른 메소드 취급

}

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

   



오버로딩


이름이 같고 인자 목록이 다른 메소드 두 개 만들기.

상속이나 다형성과는 관계가 전혀 없다.

호출하는 쪽의 편의를 위해 같은 메소드를 서로 다른 인자 목록을 가진 여러 버전으로 만들수 있다.

int형을 인자로 받는 메소드를 호출하는 코드에 double을 받으려면 double형을 인자로 받는 메소드를 호출하는 버전의 메소드를 만들면 된다.

오버로드된 메소드의 여러가지(조건들)을 이행할 필요가 없기 때문에 접근단계 설정이 자유롭다.

상위클래스와의 메소드와 이름이 같아도 매개변수의 타입 개수 순서가 다르면 오버로딩이다.

상속 받은것 외에 기존에 없는 새로운 메소드를 정의한다.



시그니처(메소드 이름, 매개변수 리스트)가 다르기 때문에 다음은 각기 다른 메소드이다.

public class SquareOverload {
 public static int square(int n) {
  System.out.println("Integer Square");
  return n*n;
 }
 
 public static long square(long l) {
  System.out.println("long Square");
  return l*l;
 }
 
 public static double square(double d) {
  System.out.println("double Square");
  return d*d;
 }
 
 public static void main(String[] args) {
  int n = 5;
  long l = 100;
  double d = 1000.0;
 
  System.out.println("n Square = " + square(n));
  System.out.println("l Square = " + square(l));
  System.out.println("d Square = " + square(d));
 }
}


반환값도 시그니처의 한 부분이지만 메소드를 구분하는 요소로 쓰이지는 않는다.

다음은 같은 클래스 안에서 정의 될수 없다.

long square(long d)

int square(long d)

Posted by 청웨일

상속

C/Java : 2007. 11. 5. 15:27
하위클래스는 상위클래스를 확장한다.

 하위클래스는 상위클래스의 모든 public으로 지정한 인스턴스변수와 메소드를 상속하지만 private로 지정한 인스턴스변수와 메소드는 상속할수 없다.

 메소드는 오버라이드 할수 있지만 인스턴스변수는 오버라이드 할수 없다.
 하위클래스에서 재정의 할수 있지만 오버라이드와는 다르다.

 'A는 B다' 테스트를 활용하여 상속 계층이 올바른지 확인한다.

 'A는 B다' 는 한방향으로만 작동한다.

 ex)하마는 동물이지만 모든 동물이 하마는 아니다.

 하위클래스에서 메소드를 오버라이드하면, 하위클래스의 인스턴스에 대해 그 메소드를 호출하면 오버라이드된 버전의 메소드가 호출된다.(맨 밑의 것)

 B가 A를 확장하고 C가 B를 확장하면 B는 A이고, C는 B이고, C는 A이다.(A→B→C)


 

상위 클래스의 확장(extends)


하위 클래스에서 별도의 메소드와 인스턴스 변수를 추가할 수 있고

상위클래스에서 상속받은 메소드를 오버라이드 할 수도 있다.


부모클래스 이름 / 하위클래스 이름 / 상속 예약어


//상위 클래스

public class Doctor {

        boolean worksAtHospital;

        void treatPatient() {   }

}


//하위클래스 1

public class FamilyDoctor extends Doctor {

}


//하위클래스 2

public class Surgeon extends Doctor{

}


Doctor를 상속(extends)하는 하위 클래스 FamilyDoctor, Surgeon


                 

               doctor

          ↗              ↖

                       

surgeon        familydoctor


 상속의 장점

 코드가 중복되는 것을 방지한다.
상위 클래스만 변경하면 하위클래스도 변경된다.
하지만 하위클래스에서 변경된다고 상위클래스의 것이 바뀌지 않는다.
 상위클래스에서 메소드를 정의하면 그 메소드는 하위클래스로 상속될수 있고, 다른 코드에 상위클래스 형식을 쓰는 모든 하위클래스에 메소드의 용도를 알려주는 일종의 규약
 어떤 클래스에 대한 상위 클래스를 만들면 그 상위 클래스 형식이 들어갈수 있는 모든 자리에 해당 상위 클래스와 임의 하위클래스에 속하는 객체를 마음대로 사용할 수 있다.

 상위클래스로 선언된 레퍼런스(역참조변수)를 이용하여 하위클래스 객체를 참조할수 있다.

 Dog myDog

 =

 new Dog();

 1. 레퍼런스 변수 선언

 3. 객체와

레퍼런스 연결

 2. 객체생성

 

 단일 상속


단일상속만을 허용하고 인터페이스를 이용한 보완된 형태의 다중상속을 지원한다.

자식은 둘 이상의 부모를 가질수 없지만(단일상속) 부모는 둘 이상의 자식을 가질수 있다.

자식은 부모가 되어 자식을 가질수 있다.(확장)

Posted by 청웨일

자바 시작하기

C/Java : 2007. 11. 5. 11:15
 

# 자바는 어떤 식으로 돌아갈까.


1. 소스 - 자바언어로 코드를 작성합니다.

2. 컴파일러 - 컴파일러로 오류를 확인하고 제대로 돌아가면 최종결과를 만들어줍니다.

3. 결과물(코드) - 바이트코드라는 코딩된 문서를 만들어줍니다.

                             비교적 컴퓨터가 알아들을수 있도록 번역된 것입니다.

4. 가상머신 - 가상 머신에서 바이트코드를 실행시킵니다. 결과물이 제대로 나왔는지 확인합니다.


# 실제 자바로 할수 있는 일


1. 소스 코드를 입력 - [.java]라는 확장자로 저장됩니다.

2. 컴파일러 - 타이핑한 소스를 컴파일합니다. 오류가 없으면 [.class]라는 확장자 파일이 만들어집니다.

3. 결과물(코드) - [.class]확장자의 파일

4. 가상머신 - 실제 이해 가능한 형태가 되어 실행시켜줍니다.


# 자바 코드의 구조 (소스파일>클래스>메소드>선언문)


1. 클래스 - 하나의 프로그램에는 하나이상의 클래스가 들어갑니다.

2. 메소드 - 일반적인 함수나 프로시저 비슷~~~ 자바에서는 메소드라고 합니다.  (클래스에는 하나이상의 메소드가 있다.)

3. 선언문 - 메소드안에서 처리할 일을 지시하는 내용.


# 문법


1. 모든 선언문은 세미콜론(;)으로 끝난다.

2. 주석문 쌍슬래쉬(//)로 시작한다.

3. 대부분의 공백은 큰 의미가 없다.

4. 변수선언은 다른 언어와 다르지 않다.

5. 클래스나 메소드를 정의하는 부분은 중괄호안에 들어간다.

6. 대입연산자는 등호 한개(=)로 구성.

7. 동치 연산자는 등호 두개(==)로 구성.

8. 반복문에 관하여  아직은 C언어와 충돌하는 곳은 없어보인다.


# print / println 의 차이.


println에는 줄바꿈 문자를 포함한다.


# 소스를 쳐보자.


//p.46

public class Loopy {
 public static void main(String[] args) {
  int x=1;
  System.out.println("순환문이전");
  while(x<4) {
   System.out.println("순환문내부");
   System.out.println("x의 값은 '+x+'입니다.");
 
   x++;
   
  }
  System.out.println("여기는 순환문 이후입니다.");
 }
}



//p.47_1

class IfTest {
 public static void main(String[] args) {
  int x=3;
  if(x==3) {
   System.out.println("x는 3이군요.");
  }
  System.out.println("이부분은 무조건 실행됩니다.");
 }
}



//p.47_2

class IfTest2 {
 public static void main(String[] args) {
  int x = 2;
  if(x==3) {
   System.out.println("x는 3이군요.");
  }
  else {
   System.out.println("x는 3이 아니군요.");
  }
  System.out.println("이부분은 무조건 실행됩니다.");
 }
}



//p.47

public class DooBee {
 public static void main(String[] args) {
  int x = 1;
  while (x<3) {
   System.out.print("Doo");
   System.out.print("Bee");
   x++;
  }
  if(x==3) {
   System.out.print("Do");
  }
 }
}



//p.48 (개선해보자)

public class BeerSong {
 public static void main(String[] args) {
  int beerNum = 99;
  String word = "bottles";
 
  while (beerNum > 0) {
   if(beerNum == 1) {
    word = "bottle";
   }
   
   System.out.println(beerNum + " " + word + " of beer on the wall");
   System.out.println(beerNum + " " + word + " of beer.");
   System.out.println("Take one down.");
   System.out.println("Pass it around.");
   
   beerNum--;
   
   if(beerNum > 0) {
    System.out.println(beerNum + " " + word + " of beer on the wall");
   }
   else {
    System.out.println("No more borrles of beer the wall");
   }
  }
 }
}



//p.50

public class PhraseOMatic {
 public static void main(String[] args) {
  String[] wordListOne = {"24/7","multi-Tier","30,000 foot","B-to-B", "win-win",
    "front-end","web-based","pervasive","smart","six-sigma","critical-path",
    "dynamic"};
 
  String[] wordListTwo = {"empowered","sticky","valued-added","oriented","centric","distributed",
    "clustered","branded","outside-the-box","positioned","networded","focused","leveraged",
    "aligned","targeted","shared","cooperative","accelerated"};
 
  String[] wordListThree = {"process","tipping-point","solution","architecture","core competency",
    "strategy","mindshare","portal","space","vision","paradigm","mission"};
 
  int oneLength = wordListOne.length;
  int twoLength = wordListTwo.length;
  int threeLength = wordListThree.length;
 
  int rand1 = (int) (Math.random() * oneLength);
  int rand2 = (int) (Math.random() * twoLength);
  int rand3 = (int) (Math.random() * threeLength);
 
  String phrase=wordListOne[rand1] + " " + wordListTwo[rand2] + " " + wordListThree[rand3];
 
  System.out.println("What we need is a " + phrase);
 }
}



//p.54

class Shuffle1 {
 public static void main(String[] args) {
  int x = 3;
 
  while (x>0) {
   if(x>2) {
    System.out.print("a");
   }

   x--;
   
   System.out.print("-");
   
   if(x==2) {
    System.out.print("b c");
   }
   
   if(x==1) {
    System.out.print("d");
    x--;
   }
  }
 }
}

Posted by 청웨일

파일 시스템

C : 2007. 11. 3. 12:13
1.

* 파일을 열고 닫는 방법

FILE *fopen(char *파일이름, char *mode);
int fclose(FILE *fp); 열었으면 닫는다.


- mode

"r"     - 읽기 위한 텍스트파일 열기
"w"    - 쓰기 위한 텍스트파일 생성
"a"    - 텍스트파일에 추가
"rb"   - 읽기 위한 2진 파일 열기
"wb" - 쓰기 위한 2진 파일 생성
"ab" - 2진 파일에 추가


* 파일에서 문자들을 읽고 쓰는 방법

FILE - 파일의 크기, 현재 위치, 접근방법 등의 정보를 포함하는 구조체
fopen()함수가 실패하면 null이 반환된다.
null이 아니라는 것을 확인할 방법이 필요하다.

/*
 if((fp = fopen("myfile.txt", "w")) ==NULL) {
  printf("Cannot open file\n");
  exit(1);
 }
*/ null 포인트를 반환하면 프로그램을 종료한다.


int fgetc(FILE *fp);

- fp가 가리키는 파일에서 바이트를 문자형으로 읽어서 정수로 반환한다.
  에러가 발생하면 EOF(파일의 끝)을 반환한다.
  파일의 끝에 도달할때도 EOF를 반환한다.

int fputc(int ch, FILE *fp);

- ch의 하위바이트에 포함된 바이트를 fp와 관련된 파일에 문자형으로 쓴다.
   수행되면 쓴문자를 반환하고 에러가 발생하면 EOF를 반환한다.


p.297
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
 char str[80] = "This is a file system test.\n";
 FILE *fp;
 char *p;
 int i;
//출력을 위해서 myfile을 연다.

// fopen("myfile.txt", "w")
 if((fp = fopen("myfile.txt", "w")) ==NULL) {
  printf("Cannot open file\n");
  exit(1);
 }
//str을 디스크에 쓴다.
 p = str;
 while(*p) {
  if(fputc(*p, fp) == EOF) {
   printf("Error writiing file\n");
   exit(1);
  }
  p++;
 }
 fclose(fp);
//입력을 위해서 myfile을 연다.
 if((fp = fopen("myfile.txt", "r")) == NULL) {
  printf("Cannot open file\n");
  exit(1);
 }
//파일을 다시 읽는다.
 for(; ;) {
  i = fgetc(fp);
  if(i == EOF) break;
  putchar(i);
 }
 fclose(fp);

 return 0;
}


p.302_1
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 FILE *fp;
 char ch;

 if(argc != 2) {
  printf("wrong");
  exit(1);
 }
 if((fp=fopen("myfile.txt", "r"))==NULL) {
  printf("null space");
  exit(1);
 }

 while((ch=fgetc(fp)) != EOF) {
  putchar(ch);
 }

 fclose(fp);
 printf("\n\n");
 return 0;
}

p.302_2

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int count[26];  //전역변수니까 기본적으로 0으로 초기화된다.

int main(int argc, char argv[])
{
 FILE *fp;
 char ch;
 int i;


 if(argc != 2) {
  printf("weong");
  exit(1);
 }


 if((fp=fopen("myfile.txt", "r"))==NULL) {
  printf("null space");
  exit(1);
 }


 while((ch=fgetc(fp))!=EOF) {
  ch=toupper(ch);
  if(ch>='A' && ch<='Z') count[ch-'A']++;
 }


 for(i=0; i<26; i++) printf("%c - %d\n", i+'A', count[i]);


 fclose(fp);

}



 

2.

FILE *fopen(char *fname, char *mode);

- mode
"r"     - 읽기 위한 텍스트파일 열기
"w"    - 쓰기 위한 텍스트파일 생성
"a"    - 텍스트파일에 추가
"rb"   - 읽기 위한 2진 파일 열기
"wb" - 쓰기 위한 2진 파일 생성
"ab" - 2진 파일에 추가

int fclose(fp); - 파일을 닫는다.

int fgetc(FILE *fp);
                     - fp가 가리키는 파일에서 바이트를 문자형으로 읽어 정수로 반환한다.
                     - error가 발생하면 EOF(음의정수 -1)를 반환한다.
int fputc(int ch, FILE *fp);
                     - ch의 하위바이트에 포함된 바이트를 fp와 관련된 파일에 문자형으로 쓴다.
                     - ch가 정수형으로 정의되나 문자형으로 사용하여 함수를 호출할 수 있다.
                     - error가 발생하면 EOF를 반환한다.

3.

feof(*fp) - 파일의 끝에 도달하면 0이 아닌 값을 반환한다.
ferror(*fp) - 에러가 발생하면 0이 아닌 값을 반환한다.

4.

int fputs(char *str, FILE *fp); - fp와 관련된 파일에 str이 가리키는 문자열을 쓴다.
                      - 에러가 발생하면 EOF를 반환한다. 문자열 끝의 null은 기록되지 않는다.
char *fgets(char *str, int num, FILE *fp);
                      - 파일에서 문자들을 str이 가리키는 문자열에 넣는다.
                      - num값만큼 넣거나 뉴라인을 만나거나 파일의 끝에 도달할때까지 에러가 발생하면 널포인트를 반환한다.

*파일을 대상으로 입출력이 이루어진다.
fprintf(FILE *fp, char *cintrol-string, ...);     - 파일에 출력한다.
fscanf(FILE *fp, char *cintrol-string, ...);    - 파일에서 입력받는다.

5.

size_t fread(void *buffer, size_t size, size_t num, FILE *fp);
- fp와 관련된 파일에서 num개의 객체를 buffer가 가리키는 버퍼속으로 읽어들인다.
- 실제 읽은 객체의 수를 반환한다.

size_t fwrite(void *buffer, size_t size, size_t num, FILE *fp);
- buffer가 가리키는 버퍼에서 num개의 객체를 fp롸 관련된 파일에 쓴다.
- 쓰여진 객체의 수를 반환한다.

size_t - 컴파일러가 지원하는 가장 큰 객체의 크기에 해당하는 값을 저장할수 있도록 한다.

Posted by 청웨일

스트림

C : 2007. 11. 3. 12:07
 

스트림은 추상적인 개념과 물리적인 개념으로 나눈다.

프로그래머에게 있어서 스트림은 파일을 내장하고 있는 모든것,

하드디스크, 키보드, 모니터, 메모리 등등등등등... 을 말한다고 할수 있다.

이것이 물리적인 스트림이다.

추상적인 스트림은 관문적의 의미가 포함되어 있다.

이것은 fopen()와  fclose() 함수 두개로 연결되고 단절된다.

책을 읽자면 더 어려울수도 있는 개념이다.

위의 두 개의 개념은 서로 같은 것을 말하고 있을 수도 있고, 아닐수도 있다.

Posted by 청웨일