본문 바로가기

Java-Study

Java Study : 3주차 정리

제어 흐름 이해하기

조건문

주어진 조건에 따라 다른 문장을 선택할 수 있도록 프로그래밍하는 것

조건 연산자로도 구현 가능

  • if문
    • if(조건식) {
         수행문;  //조건식이 참일 경우에 이 문장을 수행
      }
  • if ~ else문
    • if(조건식) {
          수행문1; //조건식이 참일 경우 이 문장을 수행
      }
      else {
          수행문2; //조건식이 거짓일 경우 이 문장을 수행
      }
  • ii~else if~else문
    • if(조건식1) {
          수행문1;   //조건식1이 참일 경우 이 문장을 수행
      }
      else if(조건식2){
          수행문2;   //조건식2가 참일 경우 이 문장을 수행
      }
      else if(조건식3){
          수행문3;   //조건식3이 참일 경우 이 문장을 수행
      }
      else {
          수행문4;   //위의 조건이 모두 해당하지 않는 경우에 수행
      }
      수행문5;   //if~else if~else문이 끝난 후 수행함 
  • switch~case문
    • 결과가 정수 또는 문자열 값이고 그 값에 따라 수행되는 경우가 각각 다른 경우에 자주 사용한다.
    • 여러 문장이 있어도 { }를 사용하지 않는다.
    • case : ~ break; 까지가 조건에 해당하는 문장이고 일치하는 case가 없다면 default 코드가 수행된다.
    • 자바 7부터는 case 값에 문자열도 사용이 가능하다.
    • switch(조건) {
          case 값1:
              수행문1;
              break;
          case 값2:
              수행문2;
              break;
          case 값3:
              수행문3;
              break;
          default:
              수행문4;
      }

 

반복문

반복되는 일을 처리하기 위해 사용하는 것

  • while문
    • 조건식이 참인 동안 수행문 반복해서 수행한다.
    • while(조건식) {
          수행문1;   //조건식이 참인 동안 반복 수행
      }
      수행문2;   //조건식이 거짓이 되면 수행
  • do~while문
    •  { } 안의 문장을 무조건 한 번 수행한 후에 조건식을 검사하여 while문을 진행
    • do {
          수행문;    //무조건 실행
      }
      while(조건식) {
          수행문2;   //조건식이 참인 동안 반복 수행
      }
      수행문3;   //조건식이 거짓이 되면 수행
  • for문
    • 반복문 중에서 가장 많이 사용하는 반복문
    • 초기화식에서 사용할 변수를 초기화, 조건식에서 언제까지 반복할 것인지 구현
      증감식에서 반복 횟수나 변수 값을 조정
    • for(초기화식; 조건식; 증감식) {
          수행문;
      }
  • 중첩된 반복문
    • 반복문 안에 또 다른 반복문을 중첩해서 사용하는 경우가 있다.
    • for(초기화식; 조건식; 증감식) {
          for(초기화식; 조건식; 증감식) {
              수행문1;   //내부 반복문 내용 수행
          }
          수행문2;   //외부 반복문 내용 수행
      }
  • continue문
    • 반복문과 함께 쓰이며, 반복문 안에서 continue문을 만나면 이후의 문장은 수해하지 않고 for문의 처음으로 돌아가서 증감식을 수행한다.
  • break문
    • 반복문에서 break문을 사용하면 그 지점에서 더 이상 반복문을 수행하지 않고 반복문을 빠져나온다.

 

클래스와 객체

객체와 객체 지향 프로그래밍과 클래스

  • 객체 : 의사나 행위가 미치는 대상
  • 객체 지향 프로그래밍 : 객체를 정의하고 객체 간 협력을 프로그래밍하는 것
  • 클래스
    • 객체의 속성과 기능을 코드로 구현한 것
    • 객체를 클래스로 구현하는 것을 '클래스를 정의한다' 라고 한다.
    • 클래스를 정의하기 위해서는 클래스 이름과 클래스가 가지는 속성 또는 특성이 필요하다.
    • 클래스 내부에 변수로 선언하는 속성을 멤버 변수 라고 한다.
    • 클래스 이름은 대문자로 시작해야 한다.
    • (접근 제어자) class 클래스 이름 {
          멤버 변수;
          메서드;
      }

클래스 살펴보기

  • 클래스 속성을 구현하는 멤버 변수 
    • 멤버 변수에 사용하는 자료형은 두 가지가 있다.
      • 기본 자료형 : int, long, float, double 등
      • 참조 자료형 : String, Date, Student 등
        • 참조 자료형의 경우 JDK에서 제공하는 것이거나, 개발자가 직접 만들 클래스가 될 수도 있다.
    • public class Student {
          int studentID;  //학번
          String studentName; //학생 이름
          int grade;  //학년
          String address; //주소
      }

 

  • 클래스 기능을 구현하는 메서드
    • 메서드 : 클래스 내부에서 멤버 변수를 사용하여 클래스 기능을 구현한 것

 

  • 패키지란?
    • 클래스 파일의 묶음
    • 패키지를 생성하면 프로젝트 하위에 물리적으로 디렉터리가 생성된다.
    • 계층 구조를 가질 수 있다.

 

메서드

  • 함수란?
    • 하나의 기능을 수행하는 일련의 코드
    • 어떤 기능을 수행하도록 미리 구현해 놓고 필요할 때마다 호출하여 사용
  • 함수 정의하기
    • int add(int num1, int num2) {
      //int:함수 반환형, add:함수 이름, int num1, num2: 매개변수    
          int result;
          result = num1 + num2;
          return result;  //return: 예약어, result: 반환값
      }
    • 함수 이름은 함수 기능과 관련 있게 만들어야 호출하거나 이애하기 좋다.
    • 함수 반환형에 void를 쓰면 반환 값이 없다.
  • 함수 호출하고 값 반환하기
    • int num1 = 10;
      int num2 = 20;
      int sum = add(num1, num2);  //add 함수 호출
      System.out.println(sum);  //30, 값 반환

      public static int add(int n1, int n2) {
      //int:함수 반환형, add:함수 이름, int num1, num2: 매개변수
          int result;
          result = n1 + n2;
          return result;  //return 예약어
      }
    • 함수 호출할 때 넘겨주는 변수의 이름은 선언한 변수의 이름과 상관이 없다.
  • 함수의 장점
    • 함수를 사용하면 기능을 나누어 코드를 효율적으로 구현할 수 있다.
    • 기능별로 함수를 구현해 놓으면 같은 기능을 매번 코드로 만들지 않고 그 기능의 함수를 호출하면 되기 때문에 편리하다.
    • 프로그램을 시행할 때 생긴 오류를 수정하는 디버깅 작업을 할 때도 편리하다.
  • 클래스 기능을 구현하는 메소드
    • 클래스 내부에서 사용하는 멤버 함수를 메서드라 하는데 이는 멤버 변수를 사용하여 클래스의 기능을 구현한다. 
    • public class Student {
          int studentID;  //학번
          String studentName; //학생 이름
          int grade;  //학년
          String address; //주소

          public String getStudentName() {  //메서드
              return studentName;
          }

          public void steStudentName(String name){  //메서드
              studentName = name;
          }
      }

 

클래스와 인스턴스

  • 클래스 사용과 main() 함수
    • main() 함수는 자바 가상 머신이 프로그램을 시작하기 위해 호출하는 함수이다.
    • 클래스 내부에 만들지만, 클래스의 메서드는 아니다.
    • main() 함수에서 클래스를 사용하는 두 가지 방법
      • 클래스 내부에 main() 함수를 만들기
        • public class Student {
              int studentID;  //학번
              String studentName; //학생 이름
              int grade;  //학년
              String address; //주소

              public String getStudentName() {
                  return studentName;
              }

              public void steStudentName(String name){
                  studentName = name;
              }

              public static void main(String args[]) {
                  Student student1 = new Student();
                  student1.studentName = "학생";

                  System.out.println(student1.studentName);   //학생
                  System.out.println(student1.getStudentName());  //학생
          }
        • 클래스 내부에 main() 함수 생성
      • 클래스 외부에 테스트용 클래스를 만들어서 사용
        • main() 함수를 실행할 java 파일을 만들어서 함수 생성
  • new 예약어로 클래스 생성하기
    • 클래스를 생성할 때 new 예약어를 사용하고 이어서 생성자를 써 줍니다.
    • 클래스 자료형 변수를 선언하고 new 예약어로 생성자를 호출하여 대입하면 새로운 클래스가 생성된다.
    • 클래스형 변수 이름 = new 생성자;
      • Student student1 = new Student();
        • Student 클래스 자료형으로 student1 변수를 선언하고 new Student();로 Student 클래스를 생성하여
          student1에 대입한다는 뜻
  • 인스턴스 참조 변수
    • 객체 : 의사나 행위가 미치는 대상
    • 클래스 : 객체를 코드로 구현한 것
    • 인스턴스 : 클래스가 메모리 공간에 생성된 상태
    • 참조 변수 사용하기
      • 참조 변수를 사용하면 인스턴스의 멤버 변수와 메서드를 참조하여 사용할 수 있는데 이때 도트(.) 연산자를 사용한다. 
      • student1.studentName = "학생";   //멤버 변수 사용
        System.out.println(student1.getStudentName());  //메서드 사용

 

생성자

  •  Student student1 = new Student();
    클래스를 생성할 때 사용하는 Student() 같은 함수를 생성자라고 한다.
  • 생성자는 클래스를 생성할 때만 호출한다. 생성자 이름을 클래스 이름과 같고 반환값이 없다.
  • 생성자가 없는 클래스는 클래스 파일을 컴파일할 때 자바 컴파일러에서 자동으로 생성자를 만들어 준다.
    이를 디폴트 생성자 라고 한다.

 

  • 생성자 생성
    • public class Student {
          int studentID;  //학번
          String studentName; //학생 이름
          int grade;  //학년
          String address; //주소

          public Student() { }  //디폴트 생성자 직접 추가

          public Student(String sname) {  //학생 이름을 매개변수로 입력 받아서 Student 클래스를 생성하는 생성자
              studentName = sname;
          }
      }
    • 생성자를 직접 생성할 경우 디폴트 생성자를 직접 추가해 주어야 한다.
  • 생성자 오버로드
    • 클래스에서 생성자가 두 개 이상 제공되는 경우를 생성자 오버로드라고 한다.
    • public class Student {
          int studentID;  //학번
          String studentName; //학생 이름
          int grade;  //학년
          String address; //주소

          public Student() { }

          public Student(String sname) {
              studentName = sname;
          }
          public Student(String sname, int sid, int sgrade) {
              studentName = sname;
              studentID = sid;
              grade = sgrade;
          }
      }

참조 자료형

  • 클래스 자료형으로 선언하는 자료형
  • public class Student {
        int studentID;  //학번
        String studentName; //학생 이름
        Subject korSubjcet;
        Subject mathSubject;
    }

    public class Subject {
        String SubjectName;
    }

정보 은닉

  • 접근 제어자
    • 종류
      • public : 외부 클래스 어디에서나 접근할 수 있다.
      • protected : 같은 패키지 내부와 상송 관계의 클래스에서만 접근할 수 있고 그 외 클래스에서는 접근 불가
      • 아무것도 없는 경우 : default이면 같은 패키지 내부에서만 접근할 수 있다. 
      • private : 같은 클래스 내부에서만 접근할 수 있다.
    • 객체 지향 프로그램에서는 예약어를 사용해 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한을 지정할 수 있다. 이러한 예약어를 접근 제어자 라고 한다.
    • public class Student {
          int studentID;  //학번
          private String studentName; //private로 선언
      }
    • private로 선언하면 외부 클래스의 접근이 허용되지 않기 때문에 main 함수에서 호출이 불가능 하다.
  • get(), set() 메서드
    • private으로 선언한 변수를 외부 코드에서 사용하기 위해서는 public 메서드를 제공해야 한다.
    • 이때 사용 할 수 있는 것이 get(), set() 메서드 이다.
    • public class Student {
          int studentID;  //학번
          private String studentName; //학생 이름

          //private 변수인 studentName에 접근해 값을 가져오는 public get() 메서드
          public String getStudentName() {
              return studentName;
          }

          //private 변수 studentName에 접근해 값을 지정하는 public set() 메서드
          public void setStudentName(String studentName) {
              this.studentName = studentName;
          }
      }
  • 정보 은닉
    • 클래스 내부에서 사용할 변수나 메서드는 private로 선언해서 외부에서 접근하지 못하도록 하는 것을 정보 은닉이라고 한다.

 

this 예약어

  • 생성된 인스턴스 스스로를 가리키는 예약어이다.
  • 생성자에서 다른 생성자를 호출할수도 있다.
  • 자신의 주소를 반환하는데 쓰이기도 한다.
  • class BirthDay {
        int day;
        int month;
        int year;

        public void setYear(int year) {
            this.year = year;   //bDay.year = year와 같음
        }

        public void printThis() {
            System.out.println(this);
            //System.out.println(bDay)와 같음
        }
    }
    public class ThisExample {
        public static void main(String[] args) {
            BirthDay bDay = new BirthDay();
            bDay.setYear(2000);
            bDay.printThis();
        }
    }

 

객체 간 협력

  • 객체 지향 프로그램은 객체를 정의하고 객체 간 협력으로 만들어진다.
  • 학생 클래스 구현하기
public class Student {
    public String studentName;
    public int grade;
    public int money;

    //학생 이름과 가진 돈을 매개변수로 받는 생성자
    public Student(String studentName, int money) {
        this.studentName = studentName;
        this.money = money;
    }

    //학생이 버스를 타면 1000원을 지불하는 기능을 구현한 메서드
    public void takeBus(Bus bus) {
        bus.take(1000);
        this.money -= 1000;
    }

    public void takeSubway(Subway subway) {
        subway.take(1500);
        this.money -= 1500;
    }
    
    //학생의 현재 정보를 출력하는 메서드
    public void showInfo() {
        System.out.println(studentName + "님의 남은 돈은" + money + "입니다.");
    }
}

 

  • 버스 클래스 구현하기
public class Bus {
    int busNumber;
    int passengerCount;
    int money;
    
    //버스 번호를 매개변수로 받는 생성자
    public Bus(int busNumber) {
        this.busNumber = busNumber;
    }
    
    //승객이 버스에 탄 경우를 구하는 메서드
    public void take(int money) {
        this.money += money;
        passengerCount++;
    }
    
    //버스 정보를 출력하는 메서드
    public void showInfo() {
        System.out.println("버스" + busNumber + "번의 승객은" + passengerCount + "명이고, 수입은"
        + money + "입니다.");
    }
}

 

  • 지하철 클래스 구현하기
public class Subway {
    String lineNumber;
    int passengerCount;
    int money;

    //버스 번호를 매개변수로 받는 생성자
    public Subway(String lineNumber) {
        this.lineNumber = lineNumber;
    }

    //승객이 버스에 탄 경우를 구현한 메서드
    public void take(int money) {
        this.money += money;
        passengerCount++;
    }

    //버스 정보를 출력하는 메서드
    public void showInfo() {
        System.out.println("버스" + "busNumber" + "번의 승객은" + passengerCount
                + "명이고, 수입은 " + money + "입니다.");
    }
}

 

  • 학생, 버스, 지하철 객체 협력하기
public class TakeTrans {
    public static void main(String[] args) {
        Student studentJame = new Student("James", 5000);
        Student studentTomas = new Student("Tomas", 10000);

        Bus bus100 = new Bus(100);  //노선 번호가 100인 버스 생성
        studentJames.takeBus(bus100);   //james가 100인 버스를 탐
        studentJames.showInfo();    //james 정보 출력
        bus100.showInfo();  //버스 정보 출력

        Subway subwayGreen = new Subway("2호선"); //노선 번호가 2호선인 지하철 생성
        studentTomas.takeSubway(subwayGreen);   //Tomas가 2호선을 탐
        studentTomas.showInfo();    //Tomas 정보 출력
        subwayGreen.showInfo();     //지하철 정보 출력
    }
}

 

 

static 변수

  • static 변수의 정의와 사용 방법
    • 정적 변수라고도 하며 변수를 선언할 때 자료형 앞에 static 예약어를 사용한다.
      static int serialNum;
    • static 변수는 클래스 내부에 선언한다.
    • 다른 멤버 변수처럼 인스턴스가 생성될 때마다 새로 생성되는 변수가 아니다.
    • 프로그램이 실행되어 메모리에 올라갔을 때 딱 한 번 메모리 공간에 할당되고 그 값은 모든 인스턴스가 공유
    • 클래스에 기반한 변수라고 해서 클래스 변수 라고도 한다.
    • public class Student {
          public static int serialNum = 1000;
      }    

      public class StudentTest {
          public static void main(String[] args) {
              Student student1 = new Student();
              student1.serialNum++;   //static 변수 값 증가
              
              Student student2 = new Student();
              System.out.println(student2.serialNum); //증가된 값 출력
          }
      }
  • 클래스 변수
    • static 변수는 인스턴스 생성과 별개이므로 인스턴스보다 먼저 생성되기 때문에 클래스 이름으로도 참조가 가능하다.
    • public class Student {
          public static int serialNum = 1000;
          public int studentID;

          public Student() {
              serialNum++;
              studentID = serialNum;
          }
      }

      public class StudentTest {
          public static void main(String[] args) {
              Student student1 = new Student();
              System.out.println(Student.serialNum);  //1001

              Student student2 = new Student();
              System.out.println(Student.serialNum);  //1002
          }
      }
  • 클래스 메서드
    • static 변수를 위한 메서드를 클래스 메서드라고 한다.
    • public class Student {
          private public static int serialNum = 1000;
          public int studentID;

          public Student() {
              serialNum++;
              studentID = serialNum;
          }

          //serialNum의 get() 메서드
          public static int getSerialNum() {
              int i = 10;
              return serialNum;
          }

          //serialNum의 set() 메서드
          public static void setSerialNum(int serialNum) {
              Student.serialNum = serialNum;
          }
      }

      public class StudentTest {
          public static void main(String[] args) {
              Student student1 = new Student();
              System.out.println(Student.getSerialNum());

              Student student2 = new Student();
              System.out.println(Student.getSerialNum()); //증가된 값 출력
          }
      }
  • 클래스 메서드와 인스턴스 변수
    • 클래스 메서드 내부에서는 인스턴스 변수를 사용할 수 없다.
    • 클래스 메서드와 클래스 변수는 인스턴스가 생성되지 않아도 사용할 수 있다.
    • public class Student {
          private public static int serialNum = 1000;
          public int studentID;

          //serialNum의 get() 메서드
          public static int getSerialNum() {
              int i = 10;
              return serialNum;
          }

          //serialNum의 set() 메서드
          public static void setSerialNum(int serialNum) {
              Student.serialNum = serialNum;
          }
      }

      public class StudentTest {
          public static void main(String[] args) {
              System.out.println(Student.getSerialNum()); //인스턴스 생성 없이 호출 가능
          }
      }

변수 유효 범위

  • 지역 변수 유효 범위
    • 지역변수는 함수나 메서드 내부에 선언하기 때문에 함수 밖에서는 사용할 수 없다.
    • 하나의 함수에 선언한 지역 변수는 다른 함수에서 사용 불가능
    • 지역 변수가 생성되는 메모리를 스택이라 하고, 지역 변수가 호출될 때 생성되었다가 함수가 반화되면
      할당되었던 메모리 공간이 해제되면서 함께 없어진다.
  • 맴버 변수의 유효 범위
    • 멤버 변수는 인스턴스 변수라고도 한다.
    • 클래스가 생성될 때 힙 메모리에 생성되는 변수
    • 멤버 변수는 클래스의 어느 메서드에서나 사용 가능하다
  • static 변수의 유효 범위
    • static 변수는 클래스 생성과 상관 없이 처음부터 데이터 영역 메모리에 생성된다.
    • private이 아니라면 클래스 외부에서도 객체 생성과 무관하게 사용 가능하다.