오버라이딩 (Overriding)이란?

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

오버랑이딩의 조건은

자식 클래스에서 오버라이딩하는 메서드는 부모 클래스의 메서드와

-메서드 명이 같아야한다.

-매개변수가 같아야한다.

-반환 타입이 같아야한다.


오버라이딩 예시

class parent{ 	//부모 클래스 생성
	//go()메서드를 생성
	void go() {
		//콘솔창에 "집으로 가자" 출력
		System.out.println("집으로 가자");
	}
}

class child extends parent{	//부모 클래스 parent를 상속 받는다
	//부모의 go 메서드를 오버라이딩한다.
	void go() {
		//콘솔창에 "싫어 안갈래" 출력
		System.out.println("싫어 안갈래");
	}
}

public class OverridingTest {
	//main
	public static void main(String[] args) {
		//부모클래스 객체 생성	
		parent p=new parent(); 
		//생성행 객체 메서드 실행
		p.go();
		
		//자식클래스 객체 생성
		child c=new child();
		//오버라이딩한 부모 메서드 실행
		c.go();
	}
}





'지난 포스팅 > 상속(Inheritance)' 카테고리의 다른 글

JAVA 오버로딩 (Overloading)  (0) 2018.01.07
JAVA 상속(Inheritance)이란?  (0) 2017.12.29

상속(Inheritance)이란? 

기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것.

즉 부모의 객체의 멤버(인스턴스 변수, 메서드)를 자식이 물려 받는 것을 말한다.


상속을 통해서 클래스를 작성하면 코드의 양이 적어지고 공통적으로 관리가 가능하다.

또한 코드의 추가, 변경에 용의하다. 이러한 특징은 생산성과 유지보수성을 높인다.


상속관계 표현은 클래스이름 뒤에 extends와 상속받을 클래스명을 작성하면 된다.

package tistory.inheritance;

class A{	//부모클래스를 생성
	public void parent() {	//부모의 메서드
		System.out.println("나는 부모");
	}
}

class B extends A{//자식클래스를 생성한 후 부모 A 클래스를 상속 받는다
	public void child() { //자식의 메서드
		System.out.println("나는 A를 상속받은 자식");
	}
}


public class InheritanceTest {
	public static void main(String[] args) {
		B t=new B(); //부모 A를 상속받은 B를 객체생성하면
		t.parent();	//부모의 메서드와 
		t.child();	//자신의 메서드를 사용할 수 있다.
	}
}


New 엔지니어(); 

//객체 생성을 하면 부모인 사원이 먼저 객체 생성 된 후 엔지니어가 생성된다





'지난 포스팅 > 상속(Inheritance)' 카테고리의 다른 글

JAVA 오버로딩 (Overloading)  (0) 2018.01.07
JAVA 오버라이딩(Overriding)  (0) 2018.01.07

캡슐화(Encapsulation)란?

"public interface, private implementation"

Interface는 공개하고 implementation 구현부는 비공개한다.


캡슐화의 장점은 

1. 구현부를 비공개함으로써 정보를 보고하고 은닉할 수 있다.

2. 인터페이스 부분을 그대로 두고 구현부만 바꿀 수 있다. (낮은 결합도로 유지보수 향상)

3. 사용하는 측은 구현부를 몰라고 인터페이스만 가지고 사용할 수 있다.(생상성 향상)


이러한 캡슐화는 접근제어자를 이용하여 구현할 수 있다.

접근제어자 

 접근 범위

 public

 어느 곳에서든 접근이 가능

 protected

 같은 팩키지 내에서만 접근 가능하며, 상속관계시 다른 팩키지에서도 사용이 가능하다 

 [default]

 같은 팩키지 내에서만 접근 가능

 private

  자신의 클래스 내에서만 접근이 가능


1) public

public으로 변수 선언

package tistory.encap;

public class AccessTest {
	public String name="public 접근제어자"; 
	  //접근제어자는 : public, 데이터 타입: String, 변수명:name 
}

다른 팩키지에서 객체화 후 실행

package tistory.encap.test;

import tistory.encap.AccessTest;

public class Test {
	public static void main(String[] args) {
		AccessTest at=new AccessTest();  //AccessTest 클래스 객체 생성
		System.out.println(at.name);  //콘솔창에 name 값 출력
		//결과 값: public 접근제어자
		//다른 팩키지에서 클래스 접근 가능
	}
}


2) protected

protected 로 변수 선언

	
package tistory.encap;

public class AccessTest {
	protected String name="protected 접근제어자"; 
	  //접근제어자는 : protected, 데이터 타입: String, 변수명:name 
}

다른 팩키지에서 객체화 후 실행 (에러)

	
package tistory.encap.test;

import tistory.encap.AccessTest;

public class Test {
	public static void main(String[] args) {
		AccessTest at=new AccessTest();  //AccessTest 클래스 객체 생성
		System.out.println(at.name);  //콘솔창에 name 값 출력
		//에러메세지: The field AccessTest.name is not visible
		//다른 팩키지에서 클래스 접근 불가
	}
}

상속 관계로 변경 후 테스트

	
package tistory.encap;

public class AccessTest {
	protected String name="protected 접근제어자"; 
	  //접근제어자는 : protected, 데이터 타입: String, 변수명:name 
}
	
package tistory.encap.test;

import tistory.encap.AccessTest;

public class Test extends AccessTest{ //AccessTest를 상속 받는다.
	public static void main(String[] args) {
		Test at=new Test();  //AccessTest를 상속받은 Test 클래스 객체 생성
		System.out.println(at.name);  //콘솔창에 name 값 출력
		//결과값: protected 접근제어자
		//protected 접근제어자는 상속 관계일 때, 팩키지가 달라도 접근이 가능하다
	}
}


3) [default]

default로 변경 후 테스트

package tistory.encap;

public class AccessTest {
	String name="[default] 접근제어자"; 
	  //접근제어자는 : [default], 데이터 타입: String, 변수명:name 
}

에러가 난다

package tistory.encap.test;

import tistory.encap.AccessTest;

public class Test extends AccessTest{ //AccessTest를 상속 받는다.
	public static void main(String[] args) {
		Test at=new Test();  //AccessTest를 상속받은 Test 클래스 객체 생성
		System.out.println(at.name);  //상속관계라도 에러가 난다
		//에러메세지: The field AccessTest.name is not visible
		//default 접근제어자는 상속 관계라도 팩키지가 다르면 접근이 불가능하다
	}
}

같은 팩키지로 이동 후 테스트

package tistory.encap; //팩키지 이동

import tistory.encap.AccessTest;

public class Test extends AccessTest{ //AccessTest를 상속 받는다.
	public static void main(String[] args) {
		Test at=new Test();  //AccessTest를 상속받은 Test 클래스 객체 생성
		System.out.println(at.name);  //같은 팩키지로 이동시에는 에러가 안난다.
		//결과값: [default] 접근제어자
		//default 접근제어자는 상속 관계라도 팩키지가 다르면 접근이 불가능하다
		//같은 팩키지 내에서는 접근가능
	}
}


4) private

private 변경 후 같은 팩키지 내에서 테스트

package tistory.encap;

public class AccessTest {
	private String name="private 접근제어자"; 
	  //접근제어자는 : private, 데이터 타입: String, 변수명:name 
}

에러가 난다

package tistory.encap; //팩키지 이동

import tistory.encap.AccessTest;

public class Test extends AccessTest{ //AccessTest를 상속 받는다.
	public static void main(String[] args) {
		Test at=new Test();  //AccessTest를 상속받은 Test 클래스 객체 생성
		System.out.println(at.name);  //같은 팩키지라도 에러가 난다
		//에러메세지: The field AccessTest.name is not visible
		//private 접근제어가는 같은 팩키지라도 에러가 난다.
	}
}

private 접근 제어자 다른 클래스 또는 팩키지에서는 접근 불가 ,

즉 같은 클래스내에서만 접근 가능

package tistory.encap; public class AccessTest { private String name="private 접근제어자"; //접근제어자는 : private, 데이터 타입: String, 변수명:name // private 접근 제어자 -> 다른 클래스 또는 팩키지에서는 // 접근 불가 , 즉 같은 클래스내에서만 접근 가능 // getter 를 이용해 간접 접근은 허용 // getter : 사용자가 필요한 정보를 반환하는 메서드 public String getName() { return name; } }

그러나 간접 접근이 가능하다

package tistory.encap; 


public class Test { 
	public static void main(String[] args) {
		AccessTest at=new AccessTest();  //AccessTest를 상속받은 Test 클래스 객체 생성
		System.out.println(at.getName());  //getter를 이용해 접근해본다
		//실행 결과: private 접근제어자
		//private 접근제어자는 같은 클래스 내에서만 접근가능하지만
		// getter를 이용하면 간접 접근가능.
	}
}




객체지향프로그래밍은 

객체를 기본단위로 상정하고 객체와 객체의 관계를 중심으로 분석 설계하는 기법이다.


객체란 객체지향프로그램의 기본 단위로, 

속성과 기능으로 구성되어 있다.

객체의 구성요소는 속성과 기능으로 되어있다.


속성과 기능을 객체의 멤버라고도 한다. 

속성(property) 

 member variable, attribute, field, state

기능(function) 

 method, function behavior 


속성은 정보를 담고 있고 기능은 동작을 의미한다.



배열을 이용하여 로또 번호 생성하기

(도박은 정신 건강이 해롭습니다...)






public class Lotto {
	public static void main(String[] args) {
		int ball [] = new int[45];			//1~45 정수를 담을 배열을 생성
		
		for(int i=0; i < ball.length; i++) {
			ball[i] = i+1;	//i가 0부터 시작임으로 1부터 시작하도록 
						              	//i+1을 해준다.
		}
		
		int count = 0;
		int randomNum= 0;
		
		for(int i=0; i<6; i++) {
			count = ball[i];	
			//첫번째 for문의 count는 ball[0] 값인 1 이다. 
			//두번째 for문부터는 배열의 값인 2,3,4,5,6 로 증가한다
			
			randomNum = (int) (Math.random()*45); //1~45까지 임의 값을 얻는다
			ball[i] = ball[randomNum]; 
			//첫번째 for 문에서는 ball[0]에 ball[random] 배열의 값을 넣어준다
			//예를 들어 ball[0] 값은 원래 1인데
			//랜덤번호가 44면 ball[44] 배열의 값 45가 ball[0]에 할당된다 

			ball[randomNum] = count;
			//ball[randomNum] 와 원래 배열 ball[i]의 값을 서로 바꾼다.
			//예를들어 랜덤번호가 44면 ball[44] 배열안에는 ball[0]이 가지고 있던 1이 들어간다.
		}
		
		for(int i=0; i<6; i++) {
			System.out.println(ball[i]);
		}
	}
}

배열의 모든 요소를 더해서 총합과 평균을 구한다.



public class ArrayEx {
	public static void main(String[] args) {
		int sum = 0;			//총합
		float average = 0f;		//평균
		
		int point[] = {10,20,30,40,50,60,70,80,90,100};
                
                for(int i=0; i<point.length; i++) {
			sum=+point[i];		//총합에서 배열 수를 나눈다.
		}
		average = sum/point.length;

    System.out.println("총합"+sum);
		System.out.println("평균"+average);
	}
}

배열(Array)란?

"같은 타입의 여러 변수들을 하나의 묶음으로 다루는 것"


선언 방법 

선언 예 

 타입[ ] 변수이름;

int [ ] point;

String [ ] name; 

 타입 변수이름 [ ];

int point [ ];

String name [  ];


배열 생성

배열을 선언한 다음에는 배열을 생성해야한다. 배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어지는 것이고 배열을 생성해야만 비로소 값을 저장할 수 잇는 공간이 만들어지는 것이다.



타입 [ ] 변수이름;                    // 변수 선언

변수이름 = new 타입[길이];       // 변수 생성


ex) 

int [ ] point;

point = new int [5];


또는


int [ ] point = new int [5];


연산자 new 에 의해서 메모리의 빈 공간에 5개의 int를 저장할 수 있는 공간이 생긴다.


point[0] 

 point[1]

 point[2]

 point[3]

 point[]


배열의 길이는 배열이름.length로 확인 가능하다.

ex)

point.length

배열이름.length


배열의 초기화

배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본 값으로 초기화 된다.

하지만 원하는 값으로 저장하기 위해서는 요서마다 값을 지정해줘야한다.


ex) 

int [ ] point = new int [5];

point[0] = 10;

point[1] = 20;

point[2] = 30;

point[3] = 40;

point[4] = 50;


또는 간단하게 배열의 값을 초기화 할 수 있다.

int [ ] point = new int [] { 10, 20, 30, 40, 50};


또는 더 더 간단하게 

int [] point = {10,20,30,40,50};


배열의 출력

for 문을 사용하여 출력한다


int [] point = {10,20,30,40,50};


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

System.out.println(point[i]);

}


 객체 지향에서는 높은 응집도와 낮은 결합도가 중요한 분석 설계적 의미를 가진다.  

 

 객체지향개념에서 응집도와 결합도의 의미는 

    응집도( cohesion ) :  자신의 역할에 집중하는 정도 

    결합도( coupling ) : 외부 요소와 상호 의존하는 정도 


객체지향프로그램의 세 가지 특징은 응집도를 높이고 결합도는 낮추어 생산성과 유지보수성을 향상시킨다. 


1. 캡슐화 Encapsulation 

http://p-op.tistory.com/24?category=983229


2. 상속 (Inheritance)

http://p-op.tistory.com/26?category=982473


3. 다형성 (Polymorphism)

http://p-op.tistory.com/29?category=982474

+ Recent posts