JAVA용어정리(암기)

한큐에 JAVA에서 알려준 내용을 정리하는 단어장입니다.

카멜케이스

java프로젝트를 만들때 프로젝트 name은 항상 소문자로 만들되, 다음 두, 세번째 이상 나오는 단어들의 앞자리는 대문자가 되야한다.

자르(JRE)

자바라는 언을 돌아가게 하기 위한 중요 파일들을 압축해 놓은 으로 자바만이 읽을 수 있다.

SRC

폴더 혹은 패키지라 부름. 패키지안에서 자바파일을 만듬.

자바파일을 class라고 한다. 그런데 클래스명은 앞자리를 대문자로 기재야한다. (카멜케이스)

소스프로그램

문자열로 나열된 프로그램 을 소스프로그램이라하고, 그 파일을 소스파일이라 한다.

기계어

CPU가 이해하 언어로,:0(false)과 1 (true) 로 이루어져있다.

코드

01과 1로 조합한 부

바이트:

0과 1의 7개 묶

아스키코드

숫자, 영어, 특수기호로 이루어진 7자리의 표현

확장 아스키 코드

아스키코드 + 에러정정코드

유니코드

모든 국의 언어를 표현한 16자리의 묶음

컴파일

기계어와 사람 사이에 다리역할을 하는 언어로, 사람이 코딩한 프로그래밍을 CPU가 알아들을 수 있는 기계어로 바꾼다.

컴파일러

컴파일을 실행하는데 , JDK 안에 있는 컴파일러가 RAM에 올려 빠르게 실행(SSD보다 RAM이 실행이 빠르니)

컴파일을 하는이유 : CPU가 읽을수 있는 언어로 바꿔줘야 한다.

클래스파일: 컴파일을 할때, 자바파일을 읽어 클래스 확장자 파일로 만듬. 이를 중간코드, 바이트 코드라 한다.

예약어,키워 (보라색 글)

자바에서 임의로 의미를 부여해 사용하고 있는 단어, 개발자가 임의 바꿀 수 없고 키워드라 불린다.

아래 고유식별자인 Notebook을 만들었는데, 이는 클래스를 선언한 것이다. 한편, 예약어인 class 뒤에 Notebook 단어가 클래스 파일명이된다.

package

식별자인 Notebook 파일이 class 101 폴더 혹은 패키지 안에 들어가 있는지 표시해주는 예약어

패키지를 만들 때,카멜케이스에 맞게 짓도록 해야하고, 한 패키지 안에 같은 파일명을 만들면 안된다.

;(세미콜른)

마침표로 이를 지울시 밑에있는 코드를 위에 올려버린다.

마침표가 찍힌 줄을 문장, 문, statemnet라 한다.

public ,class : 예약어이고 키워드, 수식자이다.

public : 접근제어자 혹은 키워드 접근 제한자, 수식자, 예약어

class : 수식자,예약어, 키워드 (실무에서 class는 분류의 최소 단위로 쓰인다.)

static : 예약어, 키워드인데 , public static은 수식자이기도 하다.

void: 함수 리턴타입

main: 함수 명 , public class 와 public static void 사이는 띄어쓴. 즉 함수 한 줄 위는 비워둔다.

초록색 글씨: 주석이라고 한다. 하지만 주석문은 틀린표현이다. 왜냐하면 주석 뒤에 마침표가 따라와야 문 혹은 문장이라 하는데, 주석은 뒤에 쉼표가 없어 주석문이라 할 수 없다.

그리고 주석은 아무렇게 쳐도 자바에서 해석을 안한다.

두개의 문장으로 구성됨. class 옆에 있는 블록(class Notebook 다음 괄호( { } )은 문장,문,스테이트라 부르지 않음

package class101;

public static void main(String[] args) {

System.out.println(111111);

}

자바는 문장단위로 실행한다.

결과적으로 class 파일은 문장과 블록으로 이루어져 있다.

사진 2를 보면 class 안에 들어간 함수는 함수가 아니다.

class 에 들어가 있는 함수(main)를 메서드라 부른다. class 밖에 있는 함수는 없다.

메서드: 한개 기능을 처리하는 곳 이다. 예를들어 자동차 구성을 보면 자동라는 class가 있고, 기어 D라는 전진하는 기능을 메서드라고 생각한다. 그럼 기어 R은 차가 후진하게 만드는 기능이 있다. 이 역시 메서드라고 생각하면 이해가 될 수 있다. 하지만 개발을 하다보면 메서드 안에 여러 기능을 넣는 경우가 있다. 이는 잘못된 것이고 반드시 하나의 메서드에는 한개의 기능을 처리할 수 있도록 코딩한다.

String[ ], args : 매개변수라 하고, 소괄호 안에 String 은 실인수 , 형(type) 이라 하고 , args는 매개변수 ,변수명 , 가인수라 한다.

class는 크게 두가지로 선언부와 구현부로 나뉜다. class 바깥을 class 선언부라 하고, class 안쪽인 중괄호안을 class 구현부라 한다.

변수

무엇을 담는 주머니 같은 역할로 값을 저장하여 보관하거나 추후 대입 추출할 때 쓴다.

public static int cpuCore = 8;

주머니 이름을 cpuCore로 만듬.(사진 3)

대입연산자를(=) 기준으로 우측에 있는 값 정수형 타 8 을 좌측에 있는 cpuCore라는 주머니에 대입한다.

int 는 정수로 , 변수명 앞에 int가 붙여지면 이 변수는 정수만 넣을 수 있다.

필드

매서드 밖에 있는 변수를 필드라고 한다.

필드는 메서드보다 훨씬 큰 범위이고, 앞으로 static 앞에 붙여진 것들을 class라는 이름을 붙이자.

그렇다면 public static int cpuCore는 클래스필드이다.

또한 static void main도 클래스 메서드가 될 수 있다.

package class101;

public class NoteBook {

// 변수앞에 static이 붙어있으면 클래스 를 붙이고 ,아니면 인스턴스를 붙인다

public static int cpuCore         = 8;    //클래스 필드 , 변수명(cpuCore)는 파스칼케이스를 지킬것

public static void main(String[] args) {    //클래스 메서드


    }
}   

메서드

하나의 기능을 처리하는 메서드는 자바 실행 시, main 메서드를 제일 먼저 실행한다. 그다음 다른 메서드를 실행하는데 메인메서드에서 다른 메서드를 호출하는 방법은 음과 같다.

메인 메서드에서 다른 메서드로 이동하는 방법

  1. 이동하고 싶은 메서드가 속해있는 class 명(Notebook)을 적는다.

  2. 도트연산자(연결 연산자)를 찍는다.

  3. 이동하고 싶은 메서드 명(power)을 적는다. (호출 연산자)

  4. 마침표 찍는다.

그러면 power라는 메서드 구현부 블록으로 이동하게 된다.

except : 호출하는 메서드(main)과 호출 당하는 메서(power)가 같은 클래스 속하면 클래스명 생략이 가능하다.

package class101;
public class NoteBook {
// 변수앞에 static이 붙어있으면 클래스 를 붙이고 ,아니면 인스턴스를 붙인다

public static int cpuCore = 8;    //클래스 필드    

public static void main(String[] args) {    

    NoteBook.power();
}    


public static void power() {

    }
}

다음은 같은 클래스에 속한 메서드에서 main메서드에서 power라는 다른 메서드를 호출할 때 클래스명을 생략한 코드 예시다.

package class101;
public class NoteBook {
// 변수앞에 static이 붙어있으면 클래스 를 붙이고 ,아니면 인스턴스를 붙인다

public static int cpuCore = 8;    //클래스 필드    

public static void main(String[] args) {    

    power();
}    


public static void power() {

    }
}

표준출력스트림

main 메서드 블록에 syso 글자를 쓰고 CTRL+ SPACE 를 누르면 System.out.println(); 라는 글자가 자동완성된다. 이것을 표준 출력 스트림이라 다.

System이라는 글자를 보면 파스칼 케이스다. 파스칼 케이스의 경우, 자반에 기본적으로 들어간 class에 해당한다. 즉 main 메서드의 자바 기본 class 속한 prinln 메서드를 호출한 것이다.

그렇다면 메인 서드의 System.println 괄안에 1은 무엇일까? 1은 전달인자라 부르는데, System이라는 class의 println이라는 메서드로 1를 전달했다고 생각하면 된다. 그러면 println에 매개변수가(가인수) 1을 전달받게 된다.

println 메서드는 어떤 역할일까? Console창에 전달인자를 출력해주는 역할이다.

package class101;

public class NoteBook {
public static int cpuCore = 8;    

public static void main(String[] args) {    

    System.out.println(1);
    System.out.println(cpuCore);


    }  
}  

자바의 실행구조

  • 코딩을 하고 저장버튼 눌렀을 때 과정

자바파일을 class 파일로 변환하는 컴파일러는 JVM(C:\eGovFrameDev-3.9.0-64bit\Java\jdk1.8.0_231\bin\java)에 있다. class 파일로 변환하는 이유는 OS라는 플랫폼(프로그램이 실행되는 환경 )이 JVM이 class파일만 읽기 때문이다. JDK 안에 있는 컴파일러는 실행하려면 SSD보다 빠 램으로 올라간다. 그래서 SSD 영역에 JAVA가 파일을 컴파일러가 읽어서 class 파일을 만든다.

  • 자바 어플리케이션(자바 play버튼)을 눌렀을 때 과정

그럼 class를 읽는 JVM은 어디에 있을까? 자바 실행환경인 JRE(Java Runtime Environment)에 있다.(C:\eGovFrameDev-3.9.0-64bit\Java\jre1.8.0_231\bin\java) JRE 안에 JVM은 실행하려면 램(메모리)에 올라간다. 메모리안 코드에 static이 붙은 대상을 메서드영역에 올려놓은 다음, 자바가 제일 먼저 main을 실행하는데, 이때 Main메서드안에 들어간 변수(cpuCore)를 스택(stack)영역에 쌓아 실행한다.

결합연산자와 이항연산

자바의 변수는 크게 2가지로 나뉜다.

  • 기본형 : 정수 ,실수 등 int 타입형 , 디폴트 초기값은 0

  • 참조형 : string 타입(문자), 디폴트 초기값은 ""

결합연산자(+)

어떤 문자열과 문자열을 더할 때 사용하는 결합연산자는 정수끼리 더할 시 정수를 반환하고, 정수와 문자열을 더할 시 문자열을 반환한다. 그리고 이항연산 할 때, 소괄호가 있다면 소괄호 먼저 계산한다.(line 19)

( Tip. 자바는 최대 두개밖에 연산(이항연)을 못한다. 그래서 line 14번을 보면 88인텔i7이 출력되는것이 아니라 16인텔i7이 출력되는것을 확인할 수 있다.)

변수는 한 개의 값만 저장할 수 있어, 마지막에 입력된 값을 읽기에 초기 값을 절대로 바꿔서는 안된다.

바꾸려면 처음에 디폴트 초기값을 만든다.

package class101;

public class NoteBook {
public static int cpuCore         = 8;    
public static int cpuCore1         = 0;    // int타입의 디폴트 초기값은 0
public static String cpuName     = "인텔i7";
public static String cpuName1     = "";    // 변수 초기값. 디폴트 초기값
//클래스 필드 안 변수들의 열을 맞출때 Tab 키를 눌러 맞춘다.

public static void main(String[] args) {

				//결합연산 앞뒤로 띄우자.
    System.out.println(cpuCore + cpuName); // 인텔i7
    System.out.println(cpuCore + cpuCore + cpuName);// 이항연산 : 16인텔i7
    System.out.println(cpuName + cpuCore + cpuCore); // 인텔i788
		System.out.println(cpuName + (cpuCore + cpuCore));// 소괄호가 있다면 우선순위
		
		
		// 변수 change , 실무에서 함부로 변수값을 바꾸지 말것. 
		cpuName = "라이젠";
		System.out.println(cpuName + (cpuCore + cpuCore)); // 라이젠
		
		
		 }
}

주석설명

주석은 코드에 대한 설명을 달 때 사용되고, 코드에 대한 해석을 돕는데 사용된다.

주석을 사용하는 방법은 // 한 후 한 칸을 띄운다. 그런 주석을 길게 달면 하단에 스크롤이 생긴다.

잘못된 표기이고, 반드시 가로 스크롤이 생기지 않게 한다.

따라서 코드 위에 주석을 달고, 주석 한 줄 위에는 띄운다.

두줄 이상의 주석:

/* + enter

하다보면 *이 늘어난다. 그 안에 주석을 넣으면 되는데 한칸 띄운고 작성한다.

/** + enter 는 블록주석으로, 초록색 주석과 다르게 파란색으로 표시되며, 메서드 위에 커서를 대면 메모장처럼 주석설명이 나오고, pre 태그와 함께 사용된다.

지역변수

메서드안 선언된 변수를 지역변수라 한다.

package class101;
public class NoteBook {

public static int cpuCore         = 8;    
public static String cpuName    = "라이젠" ;


public static void main(String[] args) { 

   // 지역변수 3개 (jiYerk, jiYerk2, sukJa)   

    String jiYerk     = "지역";
    String jiYerk2     = "지역2";

    int sukJa = 1 ;
    //int sukJa = 1 ; 지역변수도 같은 이름의 변수를 사용할 수 없다.

    System.out.println();



    }  
}
  

}

아래 사진과 같이 라인표시 옆에 노란색은 에러가 아닌 , 변수를 사용하지 않고 선언만 하여 경고의 메시지니 무시해도 된다.

또한 앞에 설명한 것과 같이, 지역변수도 같은 이름의 변수를 사용할 수 없다.

같은 타입의 변수선언 시 , 콤마를 찍고 엔터를 누른다.

package class101;
public class NoteBook {

public static int cpuCore         = 8;    
public static String cpuName    = "라이젠" ;


public static void main(String[] args) { 

   // 지역변수 3개 (jiYerk, jiYerk2, sukJa)   

    String  jiYerk     = "지역",
            jiYerk2     = "지역2";

    int     sukJa = 1 ,
            sukJa2 = 2 ; 

    System.out.println();



    }  
}

필드에 선언된 변수와 지역변수의 이름이 같으면 같은 블록안에 지역변수가 가까우관계로 우 읽는다.

(하지만 실무에서는 이렇게 코딩해서는 안된다.)

package class101;
public class NoteBook {

public static int cpuCore         = 8;    
public static String cpuName    = "라이젠" ;


public static void main(String[] args) {    

    String     jiYerk     = "지역",
            jiYerk2     = "지역2";

    int sukJa = 1 , 
        sukJa2 = 2,
        cpuCore = 7;

    System.out.println(cpuCore);     // 필드의 cpuCore 값 확인 및 실행 7이 실행됨



    }   
} 

  • 지역변수와 필드의 차이점 :

사진을 보면 main 메서드 안에 생성된 지역변수는 메인 메서드 밖에서는 실행이 되지 않는다. 반면에 필드에서 생성된 변수는 메서드 어디든 사용이 가능하다.

매개변수(실인수 + 가인) 역시 지역변수와 동일하게 선언된 메서드 안에서만 실행이 가능하다.

package class101;
public class NoteBook {
public static int cpuCore         = 8;    
public static String cpuName    = "라이젠" ;


public static void main(String[] args) {    

    String     jiYerk     = "지역",
            jiYerk2     = "지역2";

    int sukJa = 1 , 
        sukJa2 = 2;

    System.out.println(cpuCore);     //7이 실행됨
}

public static void otherMethod() {

    System.out.println(cpuName); // ctrl + alt + 아래 화살표 => 복사
    
    //Error가 생김. sukJa2라는 지역변수는 Main 메서드에 속함
    System.out.println(sukJa2); 



    }
}

메서드 다중정의 (오버러딩)

시그니처 오류 : 메서드의 명이 같고, 매개변수도 같으며, 매개변수의 수가 동일하면 중복되어 오류가 발생한다. 매개변수의 가인수가 다르다고 오류가 해결되지 않는다.

따라서 메서드의 시그니처가 다르 매서드의 다중정의가 다가능하고, 오버러딩을 할 수 있다.

인스턴스 변수와 클래스 변수

static이 있으면 클래스 , static이 없으면 인스턴스

아래 사진을 보면 에러가 났음을 확인 할 수 있다. 이유는 인스터스 메서드가 메모리 영역에 없기에 클래스 메서드에서 인스턴스를 불러와도 사용이 불가능하다.

Error 1 예

package class101;
public class NoteBook {
public static int cpuCore         = 8;         // 클래스 필드
public static String cpuName    = "라이젠" ;    // 클래스 필드
public String mainBoard            = "asus" ;    // 인스턴스 필드


//클래스 메서드
public static void main(String[] args) {    

    otherMethod(); //Error why? 메모리영역안에 없
}

public void otherMethod(int cpu, String cpNm) {

    System.out.println(cpu + " " + cpNm);
    
    }
}
    

Error 2 예제

package class101; 

public class NoteBook {  
	
	
	
	public static int cpuCore 		= 8;	 	// 클래스 필드
	public static String cpuName	= "라이젠" ;	// 클래스 필드
	public String mainBoard			= "asus" ;	// 인스턴스 필드
	

	//클래스 메서드
	public static void main(String[] args) {	
		
		otherMethod(cpuCore , cpuName); //Error  오버로드가 맞지 않 
	}
	
	public static void otherMethod() {
		
		//System.out.println(cpu + " " + cpNm);
	}

	
}

예제의 otherMethod라는 메서드를 메모리영역에 사용하고 오버로드를 맞추면 에러를 해결할 수 있다.

(변수명에 Nm은 개발쪽에서 Name의 약어다. )

정답 (메서드 메모리에 올리기, 오버로드 맞)

package class101;
public class NoteBook {

public static int cpuCore         = 8;         // 클래스 필드
public static String cpuName    = "라이젠" ;    // 클래스 필드
public String mainBoard            = "asus" ;    // 인스턴스 필드


//클래스 메서드
public static void main(String[] args) {    

    otherMethod(cpuCore , cpuName); 
}

public static void otherMethod(int cpu, String cpNm) {

    System.out.println(cpu + " " + cpNm);
    
    }
}

Tip: 코딩하다가 가줄이 길어질 때

코딩하다가 가로줄이 길어지면 Tab을 두번 누른다.

이는 개발자들간의 줄이 길어져 줄바꿈을 했다는 것을 암묵적으로 알 수 있다.

package class101;
public class SihermOne1 {

public static String AhYes = "훗" ;
public static String ResultSum = "";


public static void main(String[] args) {

    dehagi(AhYes, 5);

// 줄이 길어졌을때  
    System.out.println(AhYes+ ResultSum + "줄이 길어집니다" 
                + "줄이 점점 더 길어진다니까요");
}

public static void dehagi(String uaakStr, int suaakk) {

    String iGeMo = uaakStr;
    int    aiGo = suaakk ;

    ResultSum = iGeMo + aiGo ;


    }
}

메서드 리턴타입

void는 메서드 리턴타입으로, 해당 메서드가 리턴타입이 없다.

package class101;
public class ReturnClass {

public static void main(String[] args) {


}

public static void derHagi(int i, int j) {

    return i+j; //Error
}
public static void bbegi(int i, int j) {

    return i-j; //Error
}

public static void maMuRi(int i, int j) {

    return i*j; //Error
    }
    
}

그러나 메서드 안에서 하나의 기능이 있는 메서드의 실행결과를 반환해주는 retrun을 사용 시,

리턴에 맞는 타입을 지정해줘야 한다.

9번 line void -> int 형 change

package class101
public class ReturnClass {

public static void main(String[] args) {


}

public static int derHagi(int i, int j) {

     return i + j ;
}
public static void bbegi(int i, int j) {

    return i-j;
}

public static void maMuRi(int i, int j) {

    return "입니다.";
    }
    
}

남은 메서드(bbegi, maMuRi )도 바꾸면 다음과 다.

package class101
public class ReturnClass {

public static void main(String[] args) {


}

public static int derHagi(int i, int j) {

     return i + j ;
}
public static int bbegi(int i, int j) {

    return i-j;
}

public static int maMuRi(int i, int j) {

    return "입니다.";
    }
    
}

따라서 void 를 지우고 정수 + 정수 = 정수로 int형으로 수정한다. (bbegi, maMuRi 메서드도 변경)

그리고, 메인에 bbeGiCall과 maMuRiCall 변수를 만들어 호출하면 다음과 같다.

package class101;

public class ReturnClass {

public static void main(String[] args) {

    int derHaGiCall = derHaGi(1,2),
            bbeGiCall = bbeGi(2,1);
    String     maMuRiCall=    maMuRi();

    System.out.println("더하기는" + derHaGiCall + "이고,"+
                "빼기는"+ bbeGiCall + maMuRiCall );

}

public static int derHaGi(int i, int j) {

    return i+j; 
}

public static int bbeGi(int i, int j) {

    return i-j; 

}

public static String maMuRi() {

    return "입니다.";
}

}

생성자

스턴스를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 메서드다.

성자가 있는 클래스가 메모리안에 있다면, 다른 클래스 메서드에서 어떤 메서드를 호출할 때,

생성자가 있다면 그 생성자를 먼저 읽고 main메서드로 이동한다.

package class101;
public class OtherClass {

static int k=0;

//생성자 
OtherClass(){
    k=1;
}

public static int derHaGi(int i, int j) {

    return i+j + k; 
}

public static int bbeGi(int i, int j) {

    return i-j + k; 

}
//인스턴스 메서드
public String startStr() {
    return "시작해볼게요";
}

또한 클래스의 생성자 메서드가 없더라도, 모든 클래스는 자신의 이름으로 디폴트 생성자를 가지고 있고 생략되어있다. 이를 디폴트 생성자라고 부른다.

package class101;
public class ReturnClass {
// 디폴트 생성자 
// // ReturnClass(){ //
// }

public static void main(String[] args) {

    int derHagiCall = OtherClass.derHaGi(1,2),
            bbegiCall = OtherClass.bbeGi(2,1);

    String maMuRiCall = maMuRi();

    System.out.println(derHagiCall+ bbeGiCall + startStr());

}



public static String maMuRi() {

    return "입니다.";
    }
}

추가로 static이 붙어있는 모든 것들은 어디에 속해 있는 것이 아니라, 독립적으로 메서드 영역에 올라가 있는다.

인스턴스와 객체

메모리에 올려진 것들을 모두 객체라하고, 이때 메모리 힙영역에 클래스에 올린 것을 인스턴스라 한다.

line 18, 22번을 보면 new 라는 예약어가 붙이며 생성자를 호출하는데 이것이 인스턴스라 한다.

Otherclass를 메모리에 넣으려면 타입이 필요한데 otherclass 타입을 앞에 적으면 된다.

(타입은 otherclass 타입이 되겠다.) 또한 Otherclass 왼편에 변수들은 인스턴스 변수라 하고, string과 같이 참조변수라 한다. 기본형은 int타입니다.

그리고 이 한 줄 전체를 인스턴스화 했다고 말한다.

package class101;

public class ReturnClass {
	
////
//	ReturnClass(){
//		
//	}

	public static void main(String[] args) {
		
		int derHagiCall = OtherClass.derHaGi(1,2),
				bbegiCall = OtherClass.bbeGi(2,1);
		
		String maMuRiCall = maMuRi();
		
		//메모리에 클래스를 넣게 됨 이를 인스턴스라 하고 이 한줄 전체를 인스턴스화했다고 한다.
		OtherClass  otherclass = new OtherClass(); 
		
		System.out.println(derHagiCall+ bbegiCall + otherclass.startStr());
		
	}
	

	
	public static String maMuRi() {
		
		return "입니다.";
	}

이렇게 하면 25번째 startStr 메서드를 호출할 수 있다.

그리고 인스턴스는 자기자신을 인스턴스화가 가능하다.

package class101;

public class ReturnClass {
	
////
//	ReturnClass(){
//		
//	}

	public static void main(String[] args) {
		
		int derHagiCall = OtherClass.derHaGi(1,2),
				bbegiCall = OtherClass.bbeGi(2,1);
		
		
		ReturnClass  returnClass = new ReturnClass();
		String maMuRiCall = returnClass.maMuRi();
		
		OtherClass  otherclass = new OtherClass(); 
		
		System.out.println(derHagiCall+ bbegiCall + otherclass.startStr());
		
	}
	

	
	public  String maMuRi() {
		
		return "입니다.";
	}



}

package class101;
public class ReturnClass {


// 디폴트 생성자 : 사실 모든클래스는 자신의 이름으로 생성자를 가지고 있다.
ReturnClass(){
    System.out.println(11111111);
}
// static 메서드들(클래스메서드들)은 클래스에 속한것이 아닌, 
// 독립적으로 메모리에 올라가있다.

public static void main(String[] args) {

    int derHaGiCall     = OtherClass.derHaGi(1,2),
            bbeGiCall     = OtherClass.bbeGi(2,1);


    ReturnClass returnClass = new ReturnClass();     //자기 자신을 인스턴스화 가능하다    

    String maMuRiCall    =    returnClass.maMuRi();

    OtherClass  otherclass = new OtherClass();


    System.out.println("더하기는" + derHaGiCall + "이고,"+
                "빼기는"+ bbeGiCall + otherclass.startStr());


// 그럼 인스턴스화 과정을 거쳐 드디어 21번째의 startStr의 메서드를 호출할 수 있게된다.

}

public String maMuRi() {

    return "입니다.";
    }
}

결국 생성자는 클래스의 필드나 어한 서드에 추후초기값을 지정하고 싶을 때 사용한다.

실무에서는 static이 있는 클래스는 다 static이 붙어있고, 없는경우 없는 것끼리 사용한다.

접근제어자

package class101;
public class JavaFinal {

public static String A    =    "a";
static String B         =    "b";
String c                =    "c";

public void finalMethod() {
    System.out.println("finalMethod");
    }
}

package class101;
public class DoPrint extends JavaFinal {

public void consoleOut(String str) {
    System.out.println(str);

    System.out.println(A);
    System.out.println(B);
    System.out.println(c);
    
    finalMethod();
    }
}

extends

extendes는 상속전용 키워드로 extends를 기준으로 우측이 부모 클래스, 좌측이 자식클래스가 된다.

자식 클래스는 부모 클래에 있는 필드나 메서드들을 개체 생성없이(인스턴스화 없이, static이 아니더라도 인스턴스화 없이 ) 다 사용이 가능하다. 하지만 부모클래스는 자식클래스의 그 어떠한 필드나 메서드 사용할 수 없다.

부모클래스가 자식클래스보다 더 크고,자식 클래스는 부모클래스를 이용할 수 는데, 부모 클래스에서 자식클래스를 인스턴스화 한 다음에 쓸 수는 있다. 위의 예제를 보면 자식클래스(DoPrint)에서 부모클래스( JavaFinal)의 static 필드 A , static B, 그냥 C 를 사용한 것을 알 수 있다. 호출하려면 JavaFinal. 을 붙여 사용해야되는데, 그냥 사용한 것을 보아 자식클래스는 부모클래스의 어떠한 것도 사용이 가능하다.

이번에는 otherP라는 패키지를 만들고, javaFinal 클래스 파일을 otherP라는 패키지로 드래그 하여 옮겨보자.

package otherP;
public class JavaFinal {

public static String A    =    "a";
static String B         =    "b";
String c                =    "c";

public void finalMethod() {
    System.out.println("finalMethod");
}
}

그럼 Doprint 클래스파일의 line 9~10 인 system.out.println(B),systm.out.println(c)가 오류날 것이다.

public 접근 제어자 덕에 A는 오류가 나지 않았다.

public 접근 제어자 (디폴트 접근 제어 )는 같은 패키안에 있다면 아무제약없이 다 접근 할 수 있다.

즉 public 접근 어자는 접근제한이 없으며, 프로젝트 안의 모든 곳에서 접근이 가능하다.

상속 전용 접근 제어자 (protected)

line 5~6번째 protected라는 접근제어자를 붙였다.

그러면 Doprint에서 오류가 나지 않는다.

protected라는 접근제어자는 상속관계에 있다면 패키지가 다르더라도 어디든 접근이 가능하다.

즉 상속 전용 접근 제어자가 protected다.

package otherP;
public class JavaFinal {

public static String A                    =    "a";
protected static String B                 =    "b";
protected         String c                =    "c";

public void finalMethod() {
    System.out.println("finalMethod");
}
}

이번에는 JavaFinal을 다시 class101 패키지에 옮기고, line 4번째 String 타입의 A를 private로 바꾸면 Doprint에서 오류가 날 것이다.

package class101;
public class JavaFinal {

private static String A                    =    "a";
protected static String B                 =    "b";
protected         String c                =    "c";

public void finalMethod() {
    System.out.println("finalMethod");
}
}

Private

private 접근제어자를 만드는 순간 Doprint A 부분에 오류가 난다.

private 접근 제어자들 중에서 제일 최소한의 범위로 같은 클래스 내에서만 접근이 가능하다.

부모 자식 상속관계에도 불구하고 오류가 난다. 따라서 다시 JavaFinal 클래스의 A를 public으로 바꾼다.

웹프로그래밍 구조

웹프로그래밍에는 크게 정적 웹 프로그래밍과 동적 웹 프로그래밍 방식이 있다.

정적 웹프로그래밍

요청주체인 클라이언트가 웹서버에게 요청을 할 시, 정보를 제공하는 웹서버는 클라이언트가 요구한 화면에 맞는 화면을 보여준다. 이때 관리자(admin)는 클라이언트가 요청한 것을 웹서버에게 전달받아 그것을 확인하고, 이에 맞는 정보를 웹서버에게 전달하여 클라이언트가 받게된다. 단점은 클라이언트의 요청수가 많아질수록 관리자가 요구사항에 맞는 정보를 전달해줘야 하기 때문에 관리가 힘들다. 또한 저장된 정보만 보여줄 수 있다.

동적 웹 프로그래밍 (Process 방식)

정적 웹프로그래밍에서 관리자가 해정보를 찾아 웹 서버에게 전달했다면, 그 역할을 웹어플리케이션이 수행한다고 볼 수 있다. 웹어플리케이션은 클라이언트의 요청에 따라 메모리를 생성하여 그 기능을 처리하여 웹서버에게 전달하는 방식이다. 이 방식의 단점은 클라이언트가 많아지면 웹 어플리케이션은 하나의 요청마다 하나의 메모리를 생성하기 때문에 메모리 과부하가 생길 수 있다.

동적 웹 프로그래밍 (Thread 방식)

프로세스 방식과 유사하지만 뜨레드 방식은 클라이언트들로부터 같은 요청을 받는다면, 한개의 메모리를 생성하지 고 같이 사용한다. 이때 웹어플리케이션이 서블릿, jsp이다. 그런데 웹어플리케이션은 스스로 동작할 수 없기에 웹(서블릿) 컨테이너가 웹어플리케이션이 잘 수행될 수 있도록 도와준다. 이 웹 컨테이너가 톰켓이다. 즉 톰켓은 웹 어플리케이션을 실행해주는 역할을 한다.

Last updated