0%

import문

  • 클래스를 사용할 때 패키지이름을 생략할 수 있음
1
class ImportTest {
2
  java.util.Date today = new java.util.Date();
3
}
4
5
// import문을 사용한다면..
6
7
import java.util.Date;
8
9
class ImportTest {
10
  Date today = new Date();
11
}

import문의 선언

  • import문은 패키지문과 클래스선언의 사이에 선언해야 함
  • 컴파일시에 처리되므로 프로그램의 성능에 영향이 없음
1
import 패키지명.클래스명;
2
or
3
import 패지키명.*;

static import문

  • static멤버를 사용할 때 클래스 이름을 생략할 수 있게 해줌
1
import static java.lang.Integer.*; // Integer클래스의 모든 static메서드
2
import static java.lang.Math.random; // Math.random()만. 괄호 안붙임
3
import static java.lang.System.out; // System.out을 out만으로 참조가능
  • 클래스이름이 없으면 어떤 클래스의 static멤버를 쓰는지 모르는 불편함이 있을 수 있으나 코드가 너무 길땐 필요에 의해서 사용하면 가독성에 좋음
1
import static java.lang.System.out;
2
import static java.lang.Math.*;
3
4
class Ex7_6 {
5
  public static void main(String[] args) {
6
    //System.out.println(Math.random());
7
    out.pirntln(random());
8
    
9
    //System.out.println("Math.PI: " + Math.PI);
10
    out.println("Math.PI: " + PI);
11
  }
12
}

패키지(package)

  • 서로 관련된 클래스의 묶음
  • 클래스는 클래스 파일(*.class), 패키지는 폴더, 하위 패키지는 하위 폴더
  • 클래스의 실제 이름(full name)은 패키지는 포함(java.lang.String)re.jar는 클래스들을 압축한 파일(JDK설치경로에 jre/lib 위치)

패키지 선언

  • 패키지는 소스파일의 첫 번째 문장으로 단 한번 선언
  • 같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 됨
  • 패키지 선언이 없으면 이름없는(unnamed)패키지에 속하게 됨
1
package planit;
2
3
public class PackageTest {
4
  public static void main(String[] args) {
5
    //.....
6
  }
7
}

터미널에서 컴파일하고 싶다면 클래스파일들의 root폴더인 bin로 이동 후 $ java ex.example

클래스 패스(classpath)

  • 클래스 파일(*.class)의 위치를 알려주는 경로(path)
  • 환경변수 classpath로 관리하며, 경로간의 구분자는 ‘;’를 사용
  • classpath(환경변수)에 패키지의 루트를 등록해줘야 함
  • 이클립스가 자동으로 클래스 패스들을 잡아줌 하지만 방법을 알고 있어야 함

환경변수 클래스패스 등록 방법(window기준)

*제어판 -> 환경변수검색 -> 시스템의 시스템환경변수편집 클릭 ->환경변수 클릭 -> 새로만들기 (변수값에 루트 넣어주기) *

  • 환경변수 확인하고 싶다면 터미널에서 $ set classpath

super - 참조변수

  • 객체 자신을 가리키는 참조변수, 인스턴스 메서드내에만 존재
  • 조상의 멤버를 자신의 멤버와 구별할 때 사용

super() - 조상의 생성자

  • 조상의 생성자를 호출할 때 사용
  • 조상의 멤버는 조상의 생성자를 호출해서 초기화
  • 생성자의 첫 줄에 반드시 생성자를 호출해야 함
  • 그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();을 삽입

image

image

단일 상속

  • Java는 단일상속만을 허용
1
class TvDVD extends Tv, DVD {
2
  // 에러, 조상은 하나만 허용
3
}
  • 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
1
class Tv {
2
  boolean power;
3
  int channel;
4
  
5
  void power() { power = !power; }
6
  void channelUp() { ++channel; }
7
  void channelDown() { --channel; }
8
}
9
10
class DVD {
11
  boolean power;
12
  
13
  void power() { power = !power; }
14
  void stop() { /*내용생략*/ }
15
  void rew() { /*내용생략*/ }
16
  void ff() { /*내용생략*/ }
17
}
1
class TvDVD extends Tv {
2
  DVD dvd = new DVD();
3
  
4
  void play() {
5
    dvd.play();
6
  }
7
  void stop() {
8
    dvd.stop();
9
  }
10
  void rew() {
11
    dvd.rew();
12
  }
13
  void ff() {
14
    dvd.ff();
15
  }
16
}

Object클래스 - 모든 클래스의 조상

  • 부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 됨
  • 모든 클래스는 Object클래스에 정의 11개의 메서드를 상속받음(toString(), quuals(Object obj), hashCode(),…)
1
class Tv {
2
  // ...
3
}
4
5
class SmartTv extends Tv {
6
  // ...
7
}
1
// 위코드를 컴파일 할 시
2
class Tv extends Object {
3
  // ...
4
}
5
class SmartTv extends Tv {
6
  // ...
7
}

포함이란?

  • 클래스의 멤버로 참조변수를 선언하는 것
  • 작은 단위의 클래스를 만들고, 이들을 조합해서 클래스를 만듬
1
class Circle {
2
  int x;
3
  int y;
4
  int r;
5
}
6
7
// 포함, 복잡도가 줄어드는 장점이 있음
8
class Circle {
9
  Pint c = new Point();
10
  int r;
11
}
12
13
class Point {
14
  int x;
15
  int y;
16
}
1
class Car {
2
  Engine e = new Engine();	// 엔진
3
  Door[] d = new Door[4];		// 문, 문의 개수를 넷으로 가정하고 배열을 처리함
4
}
5
6
// Car는 Engine과 Door[]을 포함시킴

클래스간의 관계 결정

  • 상속관계: ‘~은 ~이다.(is - a)’
  • 포함관계: ‘~은 ~을 가지고 있다.(has - a)’
1
class Circle{
2
  Point c = new Point();
3
  int r;
4
}
5
6
// 원(Circle)은 점(Point)이다. X
7
// 원(Circle)은 점(Point)를 가지고 있다. O

상속(Inheritance)

  • 기존의 클래스로 새로운 클래스를 작성하는 것(코드의 재사용)
  • 두 클래스를 부모와 자식으로 관계를 맺어주는 것
1
class 자식클래스 extends 부모클래스 {
2
  // ...
3
}
1
class Parent{}
2
class Child extends Parent {
3
  // ....
4
}
  • 자손은 조상(부모의 부모)의 모든 멤버를 상속받음(생성자, 초기화블록 제외)
  • 자손의 멤버 개수는 조상보다 적을 수 없음(같거나 많음)
1
class Parent {
2
  int age;
3
}
4
5
class child extends Parent {}
  • 자손의 변경은 조상에 영향을 미치지 않음
1
class Parent {
2
  int age;
3
}
4
5
class Child extends Parent {
6
  void play() {
7
    System.out.println("play!!");
8
  }
9
}
1
class Point {
2
  int x;
3
  int y;
4
}
1
// Point와 관계없는 클래스
2
class Point3D {
3
  int x;
4
  int y;
5
  int z;
6
}
1
// Point를 상속
2
class Point3D extends Point {
3
  int z;
4
}
  • 결과적으로 위의 코드와 아래 코드의 멤버는 동일하게 3개입니다.

image

image

  • SmartTv에서 정의된 것은 captiondisplaycaption()밖에 없지만 부모에게 상속받은 변수, 함수들은 사용 가능

오버로딩(overloading)

  • 한 클래스안에 같은 이름의 메서드 여러개 정의하는 것
    1
    void println()
    2
    void println(boolean x)
    3
    void println(char x)
    4
    void println(char[] x)
    5
    void println(double x)
    6
    void println(float x)
    7
    void println(int x)
    8
    void println(long x)
    9
    void println(Object x)
    10
    void println(String x)

여기서 println(123)을 입력하면 println(int)를 호출하고

또는, println("1234")을 입력하면 println(String x)를 호출합니다. 이렇듯 Java는 우리의 편의를 위해 오버로딩기능을 지원해줍니다.

오버로딩 조건

  • 메서드 이름이 같아야합니다.
  • 매개변수의 개수 또는 타입이 달라야 합니다.
  • 반환 타입은 영향이 없습니다.

아래의 예시를 보겠습니다.

image

위에 코드에서는 add의 매개변수로 오는 값에 따라서 컴퓨터가 찾아서 컴파일 해줍니다.

WAS(Web Application Server)

웹 프로그램(혹은 웹 시스템, 웹 사이트, 웹 서비스 등)을 실행시킬 수 있는 기초적인 환경을 제공

종류로는 WebLogin, WevShpere, Tomcat, jeus, JBoss 등이 있습니다.

Web Application?

  • 웹을 기반으로 실행되는 프로그램을 의미합니다.
  1. 웹브라우저 / 요청
  2. 웹서버 / 처리를 요청
  3. 웹어플리케이션 / 처리를 수행
  4. DB / 처리를 수행
  5. 웹어플리케이션 / 서버(처리결과를 웹서버로 돌려보냄)
  6. 웹서버 / 응답
  7. 웹 브라우저

Web Server

대표적으로는 Apache, WebtoB 등이 있습니다. 웹 서버는 작성된 html페이지 등을 네트워크망에 종속되지 않고, 웹 서비스를 할 수 있도록 어플리케이션이라고 생각하면 간단합니다. HTTP를 통해 웹 브라우저에서 요청하는 HTML문서나 오브젝트(이미지 파일 등)을 전송해주는 서비스를 말합니다.

Web Server와 Web Application Server의 차이

  • 웹 서버의 아파치나 IIS와 같은 소프트웨어는 HTML/ CGI나 기타 웹 문서들을 HTTP규약에 따라 웹 클라이언트와 주고 받으며 통신하는 것이 주 역할입니다.
  • 웹 애플리케이션 서버는 우선 규모가 크고 엔터프라이즈 환경에 필요한 트랜잭션, 보안, 트래픽관리, DB커넥션 풀, 사용자 관리 등등의 다양하고 강력한 기능을 제공하는 s/w를 의미합니다.

Static(정적)이란?

고정된이란 의미를 가지고 있습니다. Static이라는 키워드를 사용하여 Static변수와 Static메소드를 만들 수 있는데 다른말로 정적필드와 정적 메소드라고도 하며 이 둘을 합쳐 정적 멤버(또는 클래스 멤버)라고 합니다. 정적 필드와 정적 메소드는 객체에 소속된 멤버가 아니라 클래스에 고정된 멤버입니다.그렇기에 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리됩니다. 따라서 클래스의 로딩이 끝나는 즉시 사용할 수 있습니다.

정적 멤버 선언

필드나 메소드를 생성 시 인스턴스로 생성할것인지 정적으로 생성할것인지에 대한 판단 기준은 공용으로 사용하느냐 아니냐로 내리면 됩니다. 그냥 생성한다면 자동으로 인스턴로 생성되며 정적으로 생성하려면 필드와 메소드 선언 시 static이라는 키워드를 추가적으로 붙이면 됩니다.

1
static int num = 0;
2
public static void static_method(){
3
  
4
} // static 리턴 타입 메소드{}

예시

image

Number라는 클래스안에 클래스 변수 num과 인스턴스 변수 num2를 생성했고 두개의 Number인스턴스 number1, number2를 생성했을때 number1dptj num1과 num2를 각각 1씩 증가시키고 number2에서 num1과 num2를 각각 출력시켰을때는 num1은 1, num2는 0이 출력되었습니다.인스턴스 변수는 인스턴가 생성될때마다 생성되므로 인스턴스마다 각기 다른 값을 가지지만 정적 변수는 모든 인스턴스가 하나의 저장공간을 공유하고 항상 같은 값을 가지기에 나타난 현상입니다.

예시2

image

정적 메소든느 클래스가 메모리에 올라갈 때 정적 메소드가 자동으로 생성됩니다. 그렇기에 정적 메소드는 인스턴스를 생성하지 않아도 호출을 할 수 있습니다. 정적 메소드는 유틸리티 함수를 만드는데 유용하게 사용됩니다.

instanceof

어떤 계층에 속하는지. 클래스의 등급

1
public class unit{
2
  public int age;
3
  public void attack(){
4
    System.out.println("critical!");
5
  }
6
}
1
public class enemy extends unit{
2
  
3
}

위와 같이 unit과 unit을 상속받은 enemy라는 class가 있을 때, unit과 enemy의 기능은 유사합니다. 이 때, unit class인지 enemy class인지 구분할 때 사용하는 것이 instance입니다.

1
if('class변수' instanceof 'class이름'){
2
  
3
}
1
ex)
2
public static void main(String[] args){
3
  unit parent = new unit();
4
  
5
  if(parent instanceof unit) {
6
    System.out.println("unit 클래스입니다.");
7
  }
8
}

클래스가 상속 관계에 있을 시, 자식 클래스 변수를 instanceof를 사용하여, 부모 클래스 타입이름과 비교하더라도 true를 반환합니다.(반대로 부모 클래스는 자식 클래스로 인지되지 않습니다.)

1
public static void main(String[] args) {
2
  unit parent = new unit();
3
  enemy child = new enemy();
4
  
5
  if(child instanceof unit){
6
    System.out.println("Child는 enemy클래스이지만, enemy클래스는 unit클래스의 자식 클래스이므로 이 문구가 출력됩니다.")
7
  }
8
}

Object는 모든 클래스의 부모클래스이므로, 다른 클래스 변수와 instaceof 사용 시, ture를 반환합니다.

image

image

image