오버로딩

-하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는것을 메서드 오버로딩, 오버로딩(method overloading)이라고 한다.

-오버로딩의 조건

 메서드의 이름이 같아야한다.

 매개변수의 개수 또는 타입이 달라야 한다.

 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.

=> 기존의 없는 새로운 메서드를 정의하는 것(new)



오버라이딩

-조상클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것을 오버라이딩(overriding)이라고 한다.

-오버라이딩의 조건

선언부가 같아야한다.(이름, 매개변수, 리턴타입)

접근제어자를 좁은 범위로 변경 할 수 없다.

조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

=> 상속받은 메서드의 내용을 변경하는 것(change, modify)

'Java' 카테고리의 다른 글

this와 super  (0) 2014.12.16
상속(Inheritance)  (0) 2014.12.16
JVM의 메모리 구조  (0) 2014.12.16
변수의 종류  (0) 2014.12.15
클래스의 정의  (0) 2014.12.15

- 메서드 영역(Method Area)

클래스 정보와 클래스 변수가 저장되는 곳


- 호출 스택(Call Stack)

메서드의 작업공간. 메서드가 호출되명 메서드 수행에 필요한 메모리공간을 할당받고 메서드가 종료되면 사용하던 메모리를 반환한다.


- 힙(Heap)

인스턴스가 생성되는 공간. new 연산자에 의해서 생성되는 배열과 객체는 모두 여기에 생성된다.

'Java' 카테고리의 다른 글

상속(Inheritance)  (0) 2014.12.16
오버로딩 vs 오버라이딩  (0) 2014.12.16
변수의 종류  (0) 2014.12.15
클래스의 정의  (0) 2014.12.15
객체지향언어의 특징  (0) 2014.12.15


변수의 종류 

선언위치 

생성시기 

 클래스 변수

 클래스 영역

클래스가 메모리에 올라갈 때 

인스턴스 변수 

 인스턴스 생성시

 지역 변수

메서드 영역 

변수 선언문 수행시 


-인스턴스 변수

각 인스터스의 개별적인 저장공간. 인스턴스마다 다른 값 저장가능

인스턴스 생성 후, '참조변수.인스턴스변수명'으로 접근

인스턴스를 생성할 때 생성되고, 참조변수가 없을 때 가비지 컬렉터에 의해 자동제거됨


- 클래스 변수

같은 클래스의 모든 인스턴스들이 공유하는 변수

인스턴스 생성없이 '클래스이름.클래스변수명'으로 접근

클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸


- 지역 변수

메서드 내에 선언되며, 메서드의 종료와 함께 소멸

조건문, 반복문의 블럭{} 내에 선언된 지역변수는 블럭을 벗어나면 소멸



'Java' 카테고리의 다른 글

오버로딩 vs 오버라이딩  (0) 2014.12.16
JVM의 메모리 구조  (0) 2014.12.16
클래스의 정의  (0) 2014.12.15
객체지향언어의 특징  (0) 2014.12.15
변수의 타입(Data Type)  (0) 2014.12.15

1. 데이터와 함수의 겹합

변수 -> 배열 -> 구조체 -> 클래스


2. 사용자 정의 타입

 - 프로그래머가 직접 새로운 타입을 정의할 수 있다.

 - 서로 관련된 값을 묶어서 하나의 타임으로 정의한다.

'Java' 카테고리의 다른 글

오버로딩 vs 오버라이딩  (0) 2014.12.16
JVM의 메모리 구조  (0) 2014.12.16
변수의 종류  (0) 2014.12.15
객체지향언어의 특징  (0) 2014.12.15
변수의 타입(Data Type)  (0) 2014.12.15

1. 기존의 프로그래밍언어와 크게 다르지 않다

 - 기존의 프로그래밍 언어에 몇가지 규칙을 추가한 것일 뿐이다,


2. 코드의 재사용성이 높다.

 - 새로운 코드를 작성 할 때 기존의 코드를 이용해서 쉽게 작성할 수 있다.


3. 코드의 관리가 쉬워졌다.

 - 코드간의 관게를 맺어줌으로써 보다 적은 노력으로 코드변경이 가능하다.


4. 신뢰성이 높은 프로그램의 개발을 가능하게 한다.

 - 제어자와 메서드를 이용해서 데이터를 보호하고, 코드의 중복을 제거하여 코드의 불일치로 인한 오류를 방지 할 수 있다.

 

'Java' 카테고리의 다른 글

오버로딩 vs 오버라이딩  (0) 2014.12.16
JVM의 메모리 구조  (0) 2014.12.16
변수의 종류  (0) 2014.12.15
클래스의 정의  (0) 2014.12.15
변수의 타입(Data Type)  (0) 2014.12.15

1. 기본형(Primitive type)

- 8개

 boolean

char 

byte 

short 

int  

long 

float 

double 

 논리형

문자형 

정수형 

정수형 

정수형 

정수형 

실수형 

실수형 

 1byte

 2byte

 1byte

 2byte

 4byte

 8byte

 4byte

 8byte

- 실제 값을 저장


2. 참조형(Reference type)

- 기본형을 제외한 나머지(String, System등)

- 객체의 주소를 저장(4byte)

'Java' 카테고리의 다른 글

오버로딩 vs 오버라이딩  (0) 2014.12.16
JVM의 메모리 구조  (0) 2014.12.16
변수의 종류  (0) 2014.12.15
클래스의 정의  (0) 2014.12.15
객체지향언어의 특징  (0) 2014.12.15

순차 검색은 일렬로 되어 있는 자료를 처음부터 마지막까지 순서대로 검색하는 방법으로 선혈 검색(Linear Search)이라고도 한다. 순차 검색은 가장 간단하고 직접적인 방법으로 배열이나 연결 리스트로 구현된 선형 자료 구조에서 원하는 항목을 찾는 방법이다. 순차 검색은 검색해야 하는 자료의 양에 따라 효율이 달라지기 때문에 자료가 아주 많은 경우에는 비효율적이지만, 알고리즘이 단순하여 구현이 쉬운 장점이 있다.


- 정렬되지 않은 순차 자료 구조에서의 순차 검색

첫 번쨰 원소부터 시작하여 마지막 원소까지 순서대로 키값이 일치하는 원소가 있는지를 비교하여 찾는다. 키값이 일치하는 원소를 찾으면 그 원소가 몇 번째 원소인지를 반환한다. 마지막 원소까지 비교하여 키값이 일치하는 워소가 없으면 검색실패


시간복잡도 : O(n)


public class sequentialSearch1 {


public static void main(String[] args) {

int a[]={8,30,1,9,11,19,2};

int size=a.length;

sequentialSearch(a,size,9);

sequentialSearch(a,size,10);

}


static void sequentialSearch(int a[], int n, int key)

{

int i;

for(i=0 ; i<n ;i++){

if(a[i]==key) {

break;

}

}

if(i<n){

System.out.println(i+1+"번째에서 검색 성공");

}

else System.out.println("검색 실패");

}

}




- 정렬되어 있는 순차 자료 구조에서의 순차 검색

정렬되어 있지 않은 자료에서 순차 검색을 하는 경우에 검색 실패는 마지막 원소까지 모두 비교한 후에야 알 수 있다. 하지만 정렬되어 있는 자료에 대해 순차 검색을 할 경우에는 원소의 키값이 찾는 키값보다 크면 찾는 원소가 없는 것이므로 더 이상 검색을 수행하지 않고 끝낼 수 있다.


시간복잡도 : O(n)


public class sequentialSearch2 {


public static void main(String[] args) {

int a[]={1,2,8,9,11,19,29};

int size=a.length;

sequentialSearch(a,size,8);

sequentialSearch(a,size,6);

}


static void sequentialSearch(int a[], int n, int key) {

int i=0;

if(i<n){

while( a[i]<key) i++;

}

if( a[i]==key){

System.out.println(i+1+"번째에서 검색 성공");

}

else System.out.println(i+1+"번째에서 검색 실패");

}


}

'Algorithm' 카테고리의 다른 글

병합 정렬(Merge Sort)  (0) 2014.12.03
삽입 정렬(Insert Sort)  (0) 2014.12.02
퀵 정렬(Quick Sort)  (0) 2014.12.02
버블 정렬(Bubble Sort)  (0) 2014.12.02
선택 정렬(Selection Sort)  (0) 2014.12.02

병합 정렬은 여러 개의 정렬된 자료의 집합을 겹합하여 한 개의 정렬된 집합으로 만드는 정렬 방법이다. 병합 정렬은 전체 원소들에 대해서 수행하지 않고 부분집합으로 분할(Divide)하고 각 부분집합에 대해서 정렬 작업을 완성(Conquer)한 후에 정렬된 부분집합들을 다시 결합(Combine)하는 분할 정복(Divide and Conquer) 기법을 사용한다.

2개의 정렬된 자료 집합을 결합하여 하나의 집합으로 만드는 병합 방법을 2-way 병합이라 하고, n개의 정렬된 자료 집합을 결합하여 하나의 집합으로 만드는 병합 방법을 n-way병합이라고 한다.

2-way 병합 정렬은 다음과 갑ㅌ으 작업을 반복 수행하면서 완성한다.

1) 분할(Divide) : 자료들을 같은 크기의 부분집합 2개로 분할한다.

2) 정복(Conquer) : 부분집합에 있는 원소들을 정렬한다. 부분집합의 크기가 충분히 작지않으면 순환 호출을 이용하여 다시 분할한다.

3) 결합(Combine) : 정렬된 부분집합들을 하나의 집합으로 결합한다.


시간복잡도 : O(nlog2n)


public class mergeSort {

static int sorted[]=new int[30];

public static void main(String[] args) {

int a[]={69,10,30,2,16,8,31,22};

int size=a.length;

for(int i=0  ; i<a.length ; i++){

System.out.print(a[i]+" ");

}

System.out.println("\n");

mergesort(a,0,size-1);


}

public static void mergesort(int a[], int m, int n)

{

int middle;

if(m<n){

middle=(m+n)/2;

mergesort(a,m,middle);

mergesort(a,middle+1,n);

merge(a,m,middle,n);

}

}

public static void merge(int a[], int m, int middle, int n)

{

int i,j,k,t;

i=m;

j=middle+1;

k=m;

while(i<=middle&&j<=n){

if(a[i]<=a[j]){

sorted[k]=a[i];

i++;

}

else{

sorted[k]=a[j];

j++;

}

k++;

}

if(i>middle) for(t=j ; t<=n ; t++,k++) sorted[k]=a[t];

else for(t=i ; t<=middle ; t++,k++) sorted[k]=a[t];

for(t=m ; t<=n ; t++) a[t]=sorted[t];

for(int l=0  ; l<a.length ; l++){

System.out.print(a[l]+" ");

}

System.out.println("\n");

}


}

'Algorithm' 카테고리의 다른 글

순차 검색(Sequential Search)  (0) 2014.12.09
삽입 정렬(Insert Sort)  (0) 2014.12.02
퀵 정렬(Quick Sort)  (0) 2014.12.02
버블 정렬(Bubble Sort)  (0) 2014.12.02
선택 정렬(Selection Sort)  (0) 2014.12.02

삽입 정렬은 정렬되어 있는 부분집합에 정렬할 새로운 원소의 위치를 찾아 삽입하는 방법이다. 삽입 정렬에서는 정렬할 자룍 두 개의 부분집합 S와 U로 나뉘어 있다고 가정한다 앞부분 원소부터 정렬을 수행하는데 정렬된 앞부분의 원소들은 부분집합 S가 되고, 아직 정렬되지 않은 나머지 원소들은 부분집합 U가 된다. 정렬되지 않은 부분집합 U의 원소를 하나씩 꺼내서 이미 정렬되어 있는 부분집합 S의 마지막 원소부터 비교하면서 위치를 찾아 삽입하여 부분집합 S의 원소는 하나씩 늘리고 부분집합 U의 원소는 하나씩 줄인다. U의 원소를 모두 삽입하여 공집합이 되면 삽입 정렬이 완성된다.


시간복잡도 : 최소 - O(n), 최대 - O(n^2)


public class insertSort {


public static void main(String[] args) {

int a[]={69,10,30,2,16,8,31,22};

int temp,j;

for(int i=0  ; i<a.length ; i++){

System.out.print(a[i]+" ");

}

System.out.println("\n");

for(int i=1 ; i<a.length ; i++){

temp=a[i];

j=i;

while((j>0)&&(a[j-1]>temp)){

a[j]=a[j-1];

j=j-1;

}

a[j]=temp;

}

for(int i=0  ; i<a.length ; i++){

System.out.print(a[i]+" ");

}

System.out.println("\n");


}


}



'Algorithm' 카테고리의 다른 글

순차 검색(Sequential Search)  (0) 2014.12.09
병합 정렬(Merge Sort)  (0) 2014.12.03
퀵 정렬(Quick Sort)  (0) 2014.12.02
버블 정렬(Bubble Sort)  (0) 2014.12.02
선택 정렬(Selection Sort)  (0) 2014.12.02

퀵 정렬은 정렬할 전체 원소에 대해서 정렬을 수행하지 않고 기준값을 중심으로왼쪽 부분집합과 오른쪽 부분집합으로 분할(Divide)한다. 왼쪽 부분집합에는 기준값보다 작은 원소들을 이동시키고, 오른쪽 부분집합에는 기준값보다 큰 원소들을 이동시킨다. 이때 사용하는 기준값을 피봇(Pivot)이라고 하는데, 일반적으로 전체 원소 중에서 가운데에 위치한 원소를 피봇으로 선택한다.

퀵정렬은 다음의 2가지 기본 작업을 반복수행하여 완성한다.

1) 분할(Divide) : 정렬할 자료들을 기준값을 중심으로 2개의 부분집합으로 분할한다.

2) 정복(Conquer) : 부분집합의 우너소들 중에서 기준값보다 작은 원소들은 왼쪽 부분집합으로, 기준값보다 큰 원소들은 오른쪽 부분집합으로 정렬한다. 부분집합의 크기가 1이하로 충분히 작지 않으면 순환호출을 이용하여 다시 분할한다.

분할 작업을 순환적으로 반복하면서 피봇의 왼쪽 부분집합과 오른쪽 부분집합을 정렬하는 방법으로 전체 원소들을 정렬한다. 부분집합으로 분할하기 위해서 L과 R을 사용한다.


퀵 정렬을 위한 동작규칙

1. 왼쪽 끝에서 오른쪽으로 움직이면서 크기를 비교하여 피복보다 크거나 같은 원소를 찾아 L로 표시한다.

2. 오른쪽 끝에서 왼쪽으로 움직이면서 피봇보다 작은 원소를 찾아 R로 표시한다. 단, R은 L과 만나면 더 이상 왼쪽으로 이동하지 못하고 멈춘다.

3. 1과 2에서 찾은 L원소와 R원소를 서로 교환한다.

4. L과 R이 같은 원소에서 만나면 피봇과 R의 원소를 서로 교환한다.

5. 3이나 4에서 피봇에 대한 자리 교환이 발생하면, 교환 후의 자리를 피봇의 위치로 확정하고 현재 단계의 퀵 정렬이 끝난다.

6. 피봇의 확정된 위치를 기준으로 만들어진 새로운 왼쪽 부분집합과 오른쪽 부분집합에 대해서 퀵 정렬을 순환적으로 반복 수행하는데, 모든 부분집합의 크기가 1 이하가 되면 퀵 정렬을 종료한다.


시간복작도 : O(nlog2n), 같은 시간 복잡도를 가지는 다른 정렬 방법에 비해 자리교환 횟수를 줄임으로써 실행 시간 성능을 향상시킨 정렬 방법이다.


public class quickSort {


public static void main(String[] args) {

int a[]={69,10,30,16,2,8,31,22};

int size=a.length;

quicksort(a,0,size-1);


}

public static void quicksort(int a[], int begin, int end)

{

if(begin<end){

int p;

p=partition(a,begin,end);

quicksort(a, begin, p-1);

quicksort(a, p+1, end);

}

}


public static int partition(int a[], int begin, int end)

{

int pivot, temp, L, R, t;

L=begin;

R=end;

pivot=(begin+end)/2;

while(L<R){

while((a[L]<a[pivot])&&(L<R)) L++;

while((a[R]>=a[pivot])&&(L<R)) R--;

temp=a[L];

a[L]=a[R];

a[R]=temp;

if(L==pivot){

for(int i=0 ; i<a.length ; i++) System.out.print(a[i]+" ");

System.out.println();

return R;

}

}

temp=a[pivot];

a[pivot]=a[R];

a[R]=temp;

for(int i=0 ; i<a.length ; i++) System.out.print(a[i]+" ");

System.out.println();

return R;

}

}



'Algorithm' 카테고리의 다른 글

병합 정렬(Merge Sort)  (0) 2014.12.03
삽입 정렬(Insert Sort)  (0) 2014.12.02
버블 정렬(Bubble Sort)  (0) 2014.12.02
선택 정렬(Selection Sort)  (0) 2014.12.02
정렬 장소에 따른 분류  (0) 2014.12.02

버블 정렬은 인접한 두개의 원소를 비교하여 자리를 교환하는 방식으로, 첫 번째 원소부터 마지막 원소까지 반복하면 가장 큰 원소가 마지막 자리에 온다. 첫 번째 원소부터 인접한 원소끼리 계속 자리를 교환하면서 맨 마지막 자리로 이동하는 모습이 물 속에서 물 위로 올라오는 물방울 모양과 같다고 해서 버블 정렬이라고 한다.


시간복잡도 : O(n^2)


public class bubbleSort {


public static void main(String[] args) {

int a[]={69,10,30,2,16,8,31,22, 18};

int temp;

for(int i=0  ; i<a.length ; i++){

System.out.print(a[i]+" ");

}

System.out.println("\n");

for(int i=a.length-1 ; i>=0 ; i--){

for(int j=1 ; j<=i ; j++){

if(a[j-1]>a[j]){

temp=a[j-1];

a[j-1]=a[j];

a[j]=temp;

}

}

}

for(int i=0  ; i<a.length ; i++){

System.out.print(a[i]+" ");

}

System.out.println("\n");


}


}



'Algorithm' 카테고리의 다른 글

병합 정렬(Merge Sort)  (0) 2014.12.03
삽입 정렬(Insert Sort)  (0) 2014.12.02
퀵 정렬(Quick Sort)  (0) 2014.12.02
선택 정렬(Selection Sort)  (0) 2014.12.02
정렬 장소에 따른 분류  (0) 2014.12.02

선택 정렬은 전체원소들 중에서 기준 위치에 맞는 원소를 선택하여 자리를 교환하는 방식으로 정렬한다. 전체 원소 중에서 가장 작은 원소를 찾아 선택하여 첫 번째 원소와 자리를 교환한다. 그 다음 두 번째로 작은 원소를 찾아 선택하여 두 번째 원소와 자리를 교환하고, 그 다음에는 세 번째로 작은 원소를 찾아서 세 번쨰 원소와 자리를 교환한다. 과정을 반복하면서 정렬을 완성한다.


시간복잡도 O(n^2)



public class selectionSort {


public static void main(String[] args) {

int a[]={69,10,30,2,16,8,31,22};

int min,temp;

for(int i=0  ; i<a.length ; i++){

System.out.print(a[i]+" ");

}

System.out.println("\n");

for(int i=0 ; i<a.length-1 ; i++){

min=i;

for(int j=i+1 ; j<a.length ; j++){

if(a[j]<a[min]) min=j;

}

temp=a[i];

a[i]=a[min];

a[min]=temp;

}

for(int i=0  ; i<a.length ; i++){

System.out.print(a[i]+" ");

}

System.out.println("\n");


}


}

'Algorithm' 카테고리의 다른 글

병합 정렬(Merge Sort)  (0) 2014.12.03
삽입 정렬(Insert Sort)  (0) 2014.12.02
퀵 정렬(Quick Sort)  (0) 2014.12.02
버블 정렬(Bubble Sort)  (0) 2014.12.02
정렬 장소에 따른 분류  (0) 2014.12.02

+ Recent posts