레이블이 method인 게시물을 표시합니다. 모든 게시물 표시
레이블이 method인 게시물을 표시합니다. 모든 게시물 표시

2015년 10월 21일 수요일

java 강의 8일차 - 메소드, static, Design pattern,class 상속

java 강의 8일차 - 메소드, static, Design pattern,class 상속
메소드

1. 인자있는 방식, 리턴값이 있는 방식
인자 전달 방식
-값에 의한 전달 ( call by value ) 소량의 데이터
-참조 ( 주소) 에 의한 전달 ( call by reference ) ( 대량의 데이타, 복사한 데이터 )

2. 재귀호출 ( recrusion )

**Static

1.변수, 메소드, 클래스 모두에 사용 가능
2.인스턴스 와는 별도로 만들어지는 메모리
3.모든 객체가 공동으로 사용하는 메모리
4.클래스변수

static 은 class 안에서만 선언 가능, 메소드에서는 선언 불가능, 클래스와 상관이 없다

5.static blook

static{
클래스변수들을 초기화
}

별도로 static 변수들만 모여서 초기화 하는 공간

인스턴스가 만들어지기 전에 초기화가 진행된다.

** 중첩클래스 ( 내부클래스 )

접근과 관리가 편하게 하기 위해서

-일반클래스
-static 클래스

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

***Design Pattern

- Singleton Pattern
private , static , constructor(생성자)

1) 외부에서 인스턴스 생성을 할 수 없도록 막는다.
2) 클래스 내부에서 단 하나의 인스턴스를 생성해준다.
3) 생성된 인스턴스를 외부에서 사용할 수 있도록 해준다.

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

클래스의 마지막 이야기

** 상속 ( Inheritance )

부모클래스 - 슈퍼클래스, 부모클래스 - 상속을 하는 클래스 
자식클래스 - 서브클래스. 자식클래스 - 상속을 받는 클래스


1. 생성자, private - 상속불가
2. 부모의 생성자는 호출가능
1) super(),super(...)  // super는 부모의주소 this 는 자신의주소
2) super.변수, super.메소드
3) 부모의생성자가 가장 먼저 호출되어야 한다.

3.생성자의 호출 순서
1) 항상 자식은 부모의 기본생성자를 먼저 호출한다.

4.상속은 확장의 개념이다.

5. 
1) 다중상속
- 여러 부모클래스 로 부터 상속을 받아서 자식이 하나 
- 제일마지막 클래스에서 충돌이나지않으려면, 기능중복없이 철저하게만들어야함
- 자식이 어떤기능을 가졌는지 알아보려면, 모든 상위클래스들을 전부 검사해야함

2) 단일상속
- 부모클래스 하나에 자식이 여러개
- 처음엔 미흡했어도, 점점 추가시켜나가면 됨
- 자식이 어떤기능을 가졌는지 알아보려면, 바로 상위의 클래스들을 검사해나가면 됨


** 상속설계
부모클래스는 반드시 최소한의 기능으로 구성된다. 자식들이 필요한 최소한의 공통된 기능만을 구성한다





과제

주제- 변수명 메서드명 을 아이콘으로 만들어 3단계까지 내려보내본다.




-----------------------------------------------------------------------------



OutClass


package date150916;

public class OuterClass {
private int outer1;
static class InnerClass{
private int inner1;
void innerMethod(){
OuterClass oc = new OuterClass();
oc.outer1 = 100;
System.out.println("innerMethod 호출" + inner1);
System.out.println("outer : " +oc.outer1);
}
}

public static void main(String[] args) {
// TODO Auto-generated method stub
InnerClass in = new InnerClass();
in.inner1 =10;
in.innerMethod();
}

}


-----------------------------------------------------------------------------


SingletonTest



package date150916;


class SingletonDemo{
int i;
static SingletonDemo single = new SingletonDemo();//단 하나의 인스턴스 //싱글턴데모 의 참조변수인 싱글 을 하나만 생성할수있도록, 스태틱 을 넣어 추가해준다.
private SingletonDemo(){} // private 를 사용하게 해주려면 setter나 getter 가 필요한데, 이미 값이설정되있으므로; getter만 설정해주면 된다.
public static SingletonDemo getInstance(){  //이 메서드 도 스태틱 으로 선언을 해줘야 사용이가능하다
// getInstance 대신에 newInstance 로 만드는게 요즘 추세
return single;
}
}
public class SingletonTest {

public static void main(String[] args) {
// TODO Singleton Pattern
//SingletonDemo demo1 = new SingletonDemo(); // 인스턴스 생성이 잘 되나, 싱글턴은 인스턴스생성을 막아줘야하기때문에 생성자를 private로 막아 생성자체를 막는다

//위의 인스턴스 는 생성이 막혀 사용이 불가능하다.
SingletonDemo demo1 = SingletonDemo.getInstance(); // 하나의 인스턴스 주소를 데모1과 데모2가 공유한다.
SingletonDemo demo2 = SingletonDemo.getInstance();
if(demo1 == demo2)
System.out.println("Same IP");
else
System.out.println("Different IP");
}

}


---------------------------------------------------------------------------------

CMS


package prjInheritance;

public class CMS {
private int no;
private String name; // private 는 상속이 되지만; 사용이 불가 하기떄문에 상속불가 라고도 말함
private char level;
private String tel;

 public CMS(){}
public CMS ( int no, String name, char level, String tel) { // 생성자 라서 상속이 불가하다 
this.no = no;
this.name = name;
this.level = level;
this.tel = tel;
}
public void display(){
System.out.println("고객번호 : " + no);
System.out.println("고객이름 : " + name);
System.out.println("고객레벨 : " + level);
System.out.println("고객전화 : " + tel);
}

}

----------------------------------------------------------------------------------

inheritanceTest

package prjInheritance;

public class InheritanceTest {

public static void main(String[] args) {
// TODO 고객 관리 메인 프로그램
// CMS kim = new CMS(1, "김유신", 'C', "111-1111" );
// kim.display();
CMSExt hong = new CMSExt(2, "홍길동", 'B', "222-2222", "서울시종로");
hong.print();
}

}

------------------------------------------------------------------------------



package prjInheritance;

public class CMSExt extends CMS{ // CMS는 부모클래스 CMSExt 는 자식클래스
String address;
CMSExt(int no, String name, char level, String tel, String address){
// this.no = no;
// this.name = name;
// this.level = level;
// this.tel = tel;
super(no, name, level, tel);
this.address = address;
}
void print(){
display();
System.out.println("고객 주소 : " + address);
}
}

 

------------------------------------------------------------------------

Callorder

package prjInheritance;


class A{
A(){
System.out.println("A클래스의 인스턴스 생성");
}
}

class B extends A{ // B 는 A 의자식클래스
/*
 *  B(){
 
//super();
System.out.println("B클래스의 인스턴스 생성"); // B의 기본생성자를 지워보았다.
}
*/
B(){}  // B의 기본생성자를 다시 만들어줬더니, C에서 오류가 나지않는다.
B(int i){
System.out.println(i); // B의 생성자를 지우고 값을입력하자, 기본생성자가 없으므로 C에서 오류가 난다.
}
}

class C extends B{ //C 는 B의 자식클래스 이며 A 의 손자클래스
C(){
// super();
System.out.println("C클래스의 인스턴스 생성");
}
}


public class Callorder {

public static void main(String[] args) {
// TODO 생성자의 호출 순서

new C();
}

}


-----------------------------------------------------------------------------

java 강의 4일차 / 5일차 - 반복문 while 과 for // 5일차 - 클래스와 메소드

java 강의 4일차 - 반복문 while 과 for // 5일차 - 클래스와 메소드 
반복문 (Loop 


1) while
while(조건식) {
문장;
...
}

무한반복 
while(true){
...
}

2) do while


3) for
for(초기화 ; 조건식 ; 카운터)
문장;

초기화
for( ;조건식 ; 카운터)
문장;

초기화
for( ; 조건식 ; ){
문장 ;
카운터 ;
}

초기화
for ( ; ; ){
조건식
문장
카운터
}


4) 강제종료
-break -완전종료
-continue 일시종료


5) 중첩반복문



============================================================================================================================================================
-------------------------------------------------------------------




클래스

클래스란 무엇인가
1.묶음, 집합
 -변수, 메써드

----------------------------------------------------------------------------

2.설계도 -> 
설계를 완성하기 위한 
인스턴스(instance)-클래스에의해 만만들어어진 메모리복사본
클래스를 위해 만들어진 실제 메모리
이때 . 을 입력하면 메모리에 접근할수있다.
.은 접근연산자 이다.

----------------------------------------------------------------------------

3.User Define Data Type(데이터타잎 : 변수를 선언하는것)

class 자체가 데이터타잎이 됨
----------------------------------------------------------------------


4.자바 프로그램을 구성하는 최소단위 (마치 원소)
-----------------------------------------------------------------------

5.하나의 스크립트 안에 여러개의 클래스를 만들어도
클래스의 이름은 main이 둘어간 클래스의 이름을 따른다.

-==================================================


변수의 종류

1.저장되는 데이터 에 따라

1 값 그냥 변수))
   값을 저장하는 변수
  -기본 데이터타입을 사용하는 변수

  2 주소 참조변수))
   주소값을 저장하는 변수
  -class 타입을 사용하는 변수
--------------------------------------------------------------------
.2 선언된 위치에 따라

1 클래스 : 인스턴스 변수(맴버변수)
2. 메서드 : 변수 ( 지역변수)
이름(---)   의 구조를가진 글자들
print() read() 등등
( class 안에있는 함수는 method, 밖에있으면 함수)
=============================================


***method 
1.작성방법.
반환형 이름(...){
해야할 일
}

2.사용방법,
이름( ) = 호출하기

3. 호출방식
1.인자가 없는 방식  m1.line( );  ( ) 안이 비어있는방식
2.인자가 있는 방식 ( ) 안을 수치로 채워줌 : 실인자. 
실인자 = parameter 
매개변수 = argument
3.리턴값(반환값)이 있는 방식

4.return
1.값을 반환( 단 1개만 반환가능)
2.메소드의 강제종료

-------------------------------------------------------------------------------------------------------------

메소드를 이용해 채팅만들기

public class MethodTest1
{
void line(int len,char type)  
// 반환형 line 의 매개변수 , 실인자의 값을 받아주는 변수
// void 를 써주는 이유는 m1.line 라는메소드에 담긴 실인자 들을 사용하고, 수식을 반환시키기 위한 함수. 메소드에대항하는 함수
{
/* System.out.println("******************************************");
반복문을 통해서 별의 갯수를 지정해준다
*/
for(int a=0;a<len;a++){
System.out.print(type);
}
System.out.println();
}
public static void main(String args[])
{
/* System.out.println("***************************");
System.out.println("채팅 프로그램");
System.out.println("***************************");
System.out.println("1.방만들기");
System.out.println("2.초대하기");
System.out.println("3.나가기");
System.out.println("***************************");
*/

MethodTest1 m1 = new MethodTest1(); 
/* static 이 포함된 문장 안에서는 그문장 밖에있는 수식들을 사용할수없다. 
void line 을 static문장 안에 포함시키기 위해서, MethodTest1을 m1 이라 설정하고
new MethodTest1 을 통해 인스턴스를 만들어 메쏘드클래스를 static안에 포함시켰다
*/
/* 인자가 없는 방식
m1.line();
System.out.println("채팅 프로그램");
m1.line();
System.out.println("1.방만들기");
System.out.println("2.초대하기");
System.out.println("3.나가기");
m1.line();
*/
//인자가 있는방식. 실 인자 라고 부름:메소드를 호출할떄 넘겨주는 값  
/*
m1.line(30);
System.out.println("채팅 프로그램");
m1.line(45);
System.out.println("1.방만들기");
System.out.println("2.초대하기");
System.out.println("3.나가기");
m1.line(15);
*/
m1.line(30, '^'); //실인자에 출력값의 모양과 개수를 지정해줌.
System.out.println("채팅 프로그램");
m1.line(45, '-');
System.out.println("1.방만들기");
System.out.println("2.초대하기");
System.out.println("3.나가기");
m1.line(15, 'ㅂ');


}
}

----------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------여기까지 평범한 메소드의 방식.

OOP(Object OrientedPrograming)

객체지향언어.

객체와 class는 거의 비슷한의미

class가 객체라는 의미를 갖기위해서는
1.상속성 (Inheritance)
재사용
2.다형성 (polymoprhism)
3.캡슐화 (InCapsulation)
클래스 추상화,블랙박스
더이상 나눌수없는 최소한의 단위이다.


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

5.메소드의 오버로딩(overloding)
중복정의 : 겹친다 똑같은'이름'의 메소드를 여러개만들수있다.
  하나의이름으로 여러가지 기능을만들어놓으면, 이름하나로 여러가지기능을쓸수있다.
-객체지향언어의 다형성 , but 이름만 같은것
(매개변수가 달라야한다, ex)변수의이름 변수의갯수 등...)

-----------------------------------------------------------------------------------

public class MethodTest3{
void display(){
System.out.println("아무것도 없음");
}
void display(int i){
System.out.println(i);
}
void display(int i, double d){
System.out.println(i + "," +d);
}
void display(double d, int i){
System.out.println(d + "," + i);
}
//오버로딩은 비슷한 기능을하는 메소드끼리 묶어주는것이 좋다.
public static void main(String args[]){
MethodTest3 m =new MethodTest3();
m.display(100);
m.display();
m.display(3.14,50);
m.display(100,3.5);
}
}


----------------------------------------------------------------------------------------


--------------

'모듈화' 의 최소단위 는 method
어떤 기능을 떼어내어 따로 만들수있다.

class 안에 그룹지어진것들은 전부 가족이다 관계가있다.
그러나 public.static.void.main(String args[] { }
처럼 static 이 붙은것들은 관계가 있는것으로 취급을 안한다.

-------------------------------------------------------------------------
-------------------------------------------------------------------------


인스턴스의 실행순서

public class MethodTest1    4. 인스턴스의 실행
{
void line()
{ for(int a=0;a<30;a++){
System.out.print("*");
}
System.out.println();    5. 인스턴스의종료
}
public static void main(String args[])-------------------- 1.main : 시작점
{
MethodTest1 m1 = new MethodTest1();            2.인스턴스
m1.line();   3.인스턴스의호출
System.out.println("채팅 프로그램");   6.반환
m1.line();   7.인스턴스의 재호출.....
System.out.println("1.방만들기");
System.out.println("2.초대하기");
System.out.println("3.나가기");
m1.line();public class MethodTest2
{
/*3 void sum(int num1,int num2)
{
int sum = num1 + num2;
System.out.println("합계 : " + sum);
}
//계산값을 main메소드로 돌려주려면 반환값 sum을 수치 sum 으로 데이터형식을 바꿔주고 return sum; 을적어 되돌려준다는 문구를 적어준다.
그리고 데이터를 받아주는 메인의 m1.sum이 결과값의 sum과연동되어야하므로
m1.sum을수치값으르로 바꿔준다.
*/

int sum(int num1,int num2)
{
/*

int sum = num1 + num2;
return sum;
이 두문장을 없애고, return (num1 + num2); 로 수식자체를 리턴해줘도된다.
*/
return(num1 + num2) ;
/*
...
...
return; //이떄 반환형은 void
...
...
*/
}
public static void main(String args[])
{
int num1=7, num2=5;
System.out.println("두 수의 합 ");
/*1 int sum= num1 + num2;                  수식을 메소드로 만든다
System.out.println("합계 : " + sum);
*/
/*2
MethodTest2 m1 = new MethodTest2();
int sum = m1.sum(num1, num2);
System.out.println("합계 : " + sum);
*/

MethodTest2 m1 = new MethodTest2();
//int sum = m1.sum(num1, num2);
//System.out.println("합계 : " + sum);
System.out.println("합계 : " + m1.sum(num1,num2));
}
}

-----------------------------------------------------------------------

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


6.생성자 (Constructor)
-이 메서드가 호출되어야만 인스턴스가 만들어 질 수 있다.
1) 초기화 전용
2) 인스턴스가 생성될때 단 한번만 호출가능
일반메서드는 아무때나 호출가능하고 얼마든지 호출할수있었다.
3) 메서드의 이름을 클래스의 이름과 동일하게 
일반메서드는 이름을 마음대로 적어도 되었다.
4) 반환형이 없다.

5) 하나의 기능이다.

6) 모든클래스는 반드시 기본 생성자(인자없는 생성자) 를 가지고있다.
7) 단, 임의의 생성자를 작성하게 되면 더이상 기본생성자는 제공되지않는다. 


----------------------------------------------------------------------------------------------


/*

class ConsDemo{
int iValue;
double dValue;
ConsDemo(int  i,double d){
//생성자; 인스턴스를 호출할때 가장필요한 항목.생성자에 인스턴스값을 지정하면 void셋밸류가 필요없어진다.
iValue = i;
dValue = d;
}
void setValue(int i,double d){//셋밸류를 매서드지정해준다
//데이터 검증
iValue = i;
dValue = d;
}


}

public class MethodTest4{
public static void main(String args[])
{
ConsDemo cd1 = new ConsDemo(100,3.14);//o(100,3.14) 는보이드셋밸류를 지우고 생성자에 인스턴스를 지정하면서 같이 지정해준값이다.
//cd1.iValue=100;셋밸류에 값을 대입시켜 준다.
//cd1.dValue=3.14;
cd1.setValue(100,3.14);
System.out.println(cd1.iValue + "," + cd1.dValue);
}
}

전체주석
*/

class ConsDemo{
int iValue;
double dValue;
 ConsDemo(int i){
 iValue=i;
  }
 ConsDemo(){}

}

public class MethodTest4{
public static void main(String args[]){
ConsDemo cd2 = new ConsDemo(100);
ConsDemo cd1 = new ConsDemo();//기본생성자 가 생략되어 보이지않지만, 존재한다는 증거
System.out.println(cd2.dValue);
}
}

// System.gc(); 메모리정리를 부탁하는 메소드 명령어

----------------------------------------------------------------------------------------------------
  

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

7. Garbage Colletcion 
(garbage)주소를 잃어버린 인스턴스값 같은 쓰지못하고 메모리를 잡아먹는 잉여데이터들
-JVM( Java Virture Machine )
c 나 c ++ 은 프로그래머가 직접 메모리관리를 해줘야하지만, 자바는 자바버츄얼머신이 자동으로 해결
만들어져있는 쓰레기 메모리를 수고하여 사용할수있게 풀어주는 역할
메모리 정리를 하는 시기가 정해진게 아니라; 알아서 판단하여 움직임
-finalize()
콜백 메서드. 
메서드만 만들어주면, 우리가 메서드를 호출하는게아니라 자바머신이 메서드를 호출함
가비지컬렉션 에 의해서 메모리가 해지되기 직전에 호출되는 메서드

---------------------------------------------------------------------------------------------------------------------------------


--------------------------------------------------------------------------------------------------------------------------------

class Fdemo
{
int cnt;
Fdemo(){
}
Fdemo(int i)
{
cnt=i;
}
protected void finalize(){
System.out.println("청소중 : " + cnt);
}
}




public class FinalizeTest
{
public static void main(String args[]){
Fdemo demo = new Fdemo();
for ( int i =0; i<300000;i++){
new Fdemo(i);
}
}
}

java.lang.System.out.println();
println(); - 메소드
  out - 인스턴스의 주소값을 가지고 있는 참조변수
System - class
java.lang - class를 포함하는 class 일수도있으나 여기서는 자바폴더 안의 lang폴더


40만 값 이후부터 청소를 시작함



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


8. this
1) 참조변수 -우리가 만든 참조변수 가 아니라 자바에서 만들어놓은 참조변수
2) read only - 읽기전용
3) 현재 실행중인 인스턴스 의 주소
4) 모든 메소드(static 제외) 의 매개변수로서 항상존재
5) 용도
-this.변수 , this.메소드
-this( ) : 현재 인스턴스 를 생성하는 생성자를 호출




------------------------------------------------------------------------------------------


class ThisDemo{
int iValue;

ThisDemo(int i){//(this, int i) 라는 값이 숨어있음.
iValue = i;//this.ivalue=i 라는 값이 숨어있음.
}
void show(){
System.out.println(iValue);
}
}

/* class ThisDemo{
int iValue;    // 매개변수와 클래스변수의 이름이 같으면, 오작동을일으켜 클래스변수에 매개변수 값이 입력이안되고, 결국 데이터는 출력되지않는다
ThisDemo(int ivalue){
iValue = ivalue;
}
void show(){
System.out.println(iValue);
}
}



*/


public class ThisTest
{
public static void main(String args[]){
ThisDemo td1 = new ThisDemo(10);//thisdemo(주소,10)라는 값이 숨어있음.
ThisDemo td2 = new ThisDemo(20);//thisdemo(주소,20)
ThisDemo td3 = new ThisDemo(30);//thisdemo(주소,30)
td1.show();
td2.show();
td3.show();
}//모든 클래스의 메소드 에는 this 가 숨어있다 . 다만 static 에는 숨어있지않다.
}



-------------------------------------------------------------------------------------------