1. 캡슐화

  • 캡슐화란 객체의 내부 구조 및 데이터를 캡슐처럼 감싸 외부에서 직접 볼 수 없게 은닉하여 보호하는 것을 말한다.
  • 이를 위해서 클래스와 멤버변수(필드), 멤버함수(메소드)는 외부에서 접근가능한 범위를 지정할 수 있는 접근제어자와 함께 사용된다.
  • 멤버변수의 경우 보통 private키워드를 사용하여 외부로부터의 직접적인 접근을 막고, 흔히 getter/setter라 부르는 멤버함수(메소드)를 만들어 사용함으로써 내부 데이터에 제한적 접근을 할 수 있게 한다. 

 

2. 정보은닉

  • 프로그램의 세부적 구현사항을 외부로 드러내지 않도록 하는 것이다.
  • 캡슐화(Encapsulation)을 정보 은닉(information hiding) 그 자체로 혼동하는 경우가 많은데, 이는 대부분의 경우 캡슐화에 정보 은닉이 동반되도록 프로그램을 구현하는 경우가 많기 때문이다.
  • 따라서, 대부분의 경우 클래스 외부에서는 바깥으로 노출된 특정 메소드에만 접근이 가능하게하여 내부가 어떤 식으로 처리되는지를 알지 못하도록 설계된다.

 

3. 실습예제

 

MotorBike.java

package UdemyJava;

public class MotorBike {

    private int speed; //접근제어자로 외부에서 접근 불가하게 변수 설정

    void setSpeed(int speed) { //변수를 읽고 가져올수 있도록 getter/setter메소드를 생성

        if (speed > 0) {
            this.speed = speed;
        }
    }

    int getSpeed() { //변수를 읽고 가져올수 있도록 getter/setter메소드를 생성
        return speed;
    }

    public void increaseSpeed(int howMuch) {
        this.speed = this.speed + howMuch;
    }

    public void decreaseSpeed(int howMuch) {
        this.speed = this.speed - howMuch;
    }
}

 

MotorBikeRunner.java

package UdemyJava;

public class MotorBikeRunner {

    public static void main(String[] args) {

        MotorBike ducati = new MotorBike(); // MotorBike 클래스를 이용해 객체 생성
        MotorBike honda = new MotorBike();  // MotorBike 클래스를 이용해 객체 생성


        ducati.setSpeed(100); // setter메소드를 이용해 변수값 설정

        ducati.increaseSpeed(100);
        ducati.decreaseSpeed(50);

        honda.increaseSpeed(100);
        honda.decreaseSpeed(50);

        System.out.println(ducati.getSpeed()); // getter 메소드를 이용해 변수의값을 가져온다
        System.out.println(honda.getSpeed());  // getter 메소드를 이용해 변수의값을 가져온다


    }
}

'Java Study' 카테고리의 다른 글

Java Study(배열/키 값)  (0) 2023.04.04
Java Study(상속/오버라이딩)  (0) 2023.03.31
Java Study(생성자/접근제한자)  (0) 2023.03.30
Java(class/object)  (0) 2023.03.29
Java (method/메소드)  (0) 2023.03.28

1. 배열

  • 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열이라고 한다. 많은 양의 데이터를 저장하고 이를 다루기 위해 사용한다.
  • 여기서 중요한 것은 같은 타입이어야 한다는 것이며 서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다.

1) 배열 선언

자료형[] 변수 = {데이터1, 데이터2, 데이터3.....};

 

ex)

int[]  myArray = {1, 33, 4, 12, 89, 98};

String[] names = {"James", "Anthony", "Rodrigo", "Nirai"};

 

2) 배열 출력

System.out.println(변수명[인덱스 번호]);

 

** 인덱스 번호는 맨 첫번째자리부터 0으로 시작해 순차적으로 매겨진다.

 

ex)

 System.out.println(myArray[2]);
 
 System.out.println(names[3]);
  
  ------------------------------------------------
  4
  Nirai

 

2. 실습예제

Exercise) 3개의 클래스를 생성해 직원관리 프로그램을 만드세요

 

Solution)

Employee.java

package com.example.learnjava;

public class Employee {
    private String firstName;
    private String lastName;
    private int idNumber;
    private String department;
    private String position;
    private double monthlySalary;


    public Employee(String firstName, String lastName, int idNumber, String department, String position, double monthlySalary) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.idNumber = idNumber;
        this.department = department;
        this.position = position;
        this.monthlySalary = monthlySalary;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getIdNumber() {
        return idNumber;
    }

    public void setIdNumber(int idNumber) {
        this.idNumber = idNumber;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }

    public double getMonthlySalary() {
        return monthlySalary;
    }

    public void setMonthlySalary(double monthlySalary) {
        this.monthlySalary = monthlySalary;
    }
}
  • 먼저 사원들의 정보가 들어갈 필드를 생성해줍니다.
  • 그 다음 생성자를 만들어 각 필드의 값들을 초기화 시킵니다.
  • private으로 접근제한을 설정하였기 때문에 다른클래스에서 수정을 위해 getter/setter를 추가합니다.

 

Employer.java

package com.example.learnjava;

public class Employer {

    private String name;
    private String location;

    public Employer(String name, String location) {
        this.name = name;
        this.location = location;
    }

    public Employer() {
    }

    public void employeeDetails(Employee employee) {
        System.out.println("ID: " + employee.getIdNumber() + " Name: " + employee.getFirstName() +
                " " + employee.getLastName() + " Department: " + employee.getDepartment() +
                " Position: " + employee.getPosition() + " Monthly Salary: " + employee.getMonthlySalary());

	}
    
    public void calculateAnnualBonus(Employee employee) {
        double annualBonus = (employee.getMonthlySalary() * 0.15) * 11;
        System.out.println("Annual bonus for " + employee.getFirstName() +
                " is " + annualBonus);
    }
}
  • 고용주(사장)의 정보가 들어갈 필드를 생성해줍니다.
  • Employer의 빈 생성자를 만듭니다.
  • 사원들의 정보를 출력하기 위한 메소드인 employeeDetails 메소드를 만듭니다.
  • 사원들의 연간보너스를 출력하기 위한 calculateAnnualBonus 메소드를 만듭니다.

 

MyClass.java

package com.example.learnjava;

public class MyClass {
    public static void main(String[] args) {

        Employer bank = new Employer();

        Employee Jenna = new Employee("Jenna", "Lassoft", 324587, "HR",
                "Recruiter", 4500.89);

        Employee Lance = new Employee("Lance", "K.", 3245377, "IT",
                "IT/Support", 3800.59);

        bank.calculateAnnualBonus(Jenna);
        bank.calculateAnnualBonus(Lance);
        bank.employeeDetails(Lance);

    }
}
  • bank 객체를 Employer 클래스를 이용해 만듭니다.
  • Employee 클래스에서 Jenna, Lance 객체를 만들어 정보들을 삽입합니다.
  • bank.메소드명으로 원하는 메소드를 불러와 정보를 출력합니다.

 

3. 키 값

  • 자바에서 키 값을 사용할때에는 HashMap이라는 함수를 이용한다.
  • HashMap은 Map 인터페이스를 구현한 함수다. Collection Framework에 속해있다.
  • 키(key)와 값(Value)으로 구성된 객체를 저장한다. 키는 중복을 허용하지 않으며 값은 중복 저장이 가능하다. 같은 키가 새롭게 저장되면 이전에 있던 키-값은 사라진다. 

HashMap 사용방법은 다음과 같다.

 

HashMap<데이터 타입> 참조변수명 = new HashMap<>();

put(key, value)

 

ex)

package com.example.learnjava;


import java.util.HashMap;

public class JavaHashMaps {
    public static void main(String[] args) {
        HashMap<String, Integer>gameStats = new HashMap<>();
        gameStats.put("James", 100);
        gameStats.put("Ruth", 457);
        gameStats.put("Carolina", 679);

'Java Study' 카테고리의 다른 글

Java Study(캡슐화)  (0) 2023.04.19
Java Study(상속/오버라이딩)  (0) 2023.03.31
Java Study(생성자/접근제한자)  (0) 2023.03.30
Java(class/object)  (0) 2023.03.29
Java (method/메소드)  (0) 2023.03.28

1. 상속

  • 객체지향 프로그래밍에서 '상속' 관계란 부모 클래스와 자식 클래스가 주체가 되어 자식클래스가 부모의 변수 및 메서드를 상속받아 활용할 수 있는 것을 말합니다.
  • 즉, 부모가 자녀에게 변수/메서드 상속해주게 되면 자식은 부모가 가지고 있는 상태/동작을 모두 활용할 수 있습니다. 
  • 자바에서 extends 를 활용해 상속받는데, 자녀 클래스는 extends 키워드를 통해 부모 클래스를 상속받습니다. 
  • 부모 클래스는 상위 클래스(슈퍼 클래스, super class) 라고 하며, 자식 클래스는 하위 클래스(서브 클래스, sub class) 라고 합니다. 

상속의 방법은 다음과 같다.

 

public class 자식클래스명 extends 부모클래스명

public class Manager extends Employee {

}

 

2. 오버라이딩

오버라이딩(overriding)이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것이라고 할 수 있습니다.

  • 자바에서 자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 메소드를 상속받습니다.
  • 이렇게 상속받은 메소드는 그대로 사용해도 되고, 필요한 동작을 위해 재정의하여 사용할 수도 있습니다.
  • 즉, 메소드 오버라이딩이란 상속받은 부모 클래스의 메소드를 재정의하여 사용하는 것을 의미합니다.

오버라이딩의 방법은 다음과 같습니다.

 

public class 자식클래스명 extends 부모클래스명

public 리턴타입 메소드명(매개변수1, 매개변수2...){}

public class Manager extends Employee {
	public int Id() {
        return super.Id() + 100;
    }

}

 

3. 실습예제

Exercise) 아래 Rectangle.java를 상속받은 Box.java에서 area() 메소드를 오버라이딩하여 재정의 하세요

(단, 연산공식은 자유롭게 하셔도 됩니다.)

 

Rectangle.java

package com.bawp.inheritance;

public class Rectangle {

    private int length;
    private int width;
    
    public Rectangle(int length, int width) {
        this.length = length;
        this.width = width;
        
    }
   
    
    public int getLength() {
      return length;
   }

   public void setLength(int length) {
     this.length = length;
   }

   public int getWidth() {
       return width;
   }

    public void setWidth(int width) {
      this.width = width;
   }
   
   public int area() {
   
       return this.getLength() * this.getWidth();
   }


}

 

Box.java

package com.bawp.inheritance;

public class Box extends Rectangle {
    private int height; 
    
    public Box(int length, int width, int height) {
         super(length, width);
         this.height = height;
    }
    
    //getters and setters
    public void setHeight(int height) {
         this.height = height;
    }
    
    public int getHeight() {
        return this.height;
    }
    
    
    
    
   
}

 

Solution)

 

Box.java

package com.bawp.inheritance;

public class Box extends Rectangle {
    private int height;
    
    
    //MUST have this constructor ( with the super() constructor call )
    
    
    public Box(int length, int width, int height) {
         super(length, width);
         this.height = height;
    }
    
    //getters and setters
    public void setHeight(int height) {
         this.height = height;
    }
    
    public int getHeight() {
        return this.height;
    }
    
    
    //TODO: override area method
    
    
    public int area() {
        return 2 * (getLength() * getWidth() + getLength() * height + getWidth() * height);
    }
}

'Java Study' 카테고리의 다른 글

Java Study(캡슐화)  (0) 2023.04.19
Java Study(배열/키 값)  (0) 2023.04.04
Java Study(생성자/접근제한자)  (0) 2023.03.30
Java(class/object)  (0) 2023.03.29
Java (method/메소드)  (0) 2023.03.28

1. 생성자

 생성자는 new 연산자를 통해서 인스턴스를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 메소드(하지만 메소드와는 다르다.)이다. 생성자는 인스턴스 변수(필드 값 등)를 초기화 시키는 역할을 한다. 

  • 생성자는 반드시 클래스명과 동일하게 정의하여야 한다.
  • 생성자 앞에는 접근 제어자(public 등)만 올수 있다.(메소드는 static과 같은 수식어를 작성할 수 있다.) 
  • 반환값이 없으므로 void나 자료형을 작성할 수 없다.
public class MotorBike {

    private int speed;

    MotorBike() {

    }

    MotorBike(int speed) {
        this.speed = speed;
    }
  • 위와 같은 방식으로 생성자를 정의합니다.
  • 메소드와 다르게 반환 타입을 적지 않고 메소드명이 클래스명과 같다.
MotorBike ducati = new MotorBike(100);
MotorBike honda = new MotorBike(200);
MotorBike kia = new MotorBike();
  • 생성자를 이용해 객체를 생성할 때에는 위와같이 ()안에 인스턴스 값을 삽입하여 만들거나 빈공간으로 남겨서 만들어도 된다.

2. 접근제한자

접근제어자는 클래스의 멤버인 변수와 메소드들의 접근 권한을 지정합니다.

종류는 4가지로 public, protected, default, private 이며,  접근 허용 가능 범위 순서 또한 아래와 같이 나타낼 수 있습니다.

  • public : 접근 제한이 없습니다.
  • protected  : 동일한 패키지 내에 존재하거나, 파생 클래스에서만 접근이 가능합니다.
  • default  : 아무런 접근 제한자를 명시하지 않으면 default 값이 되며, 동일한 패키지 내에서만 접근이 가능합니다.
  • private  : 자기 자신의 클래스 내에서만 접근이 가능합니다.

ex)

public class Microphone {
  
    private String color;
    private String name;
    private int model;

 

3. getter | setter

1) getter : getter메소드를 이용하면 원하는 멤버변수의 정보를 얻을 수 있습니다.

2) setter : setter메소드를 이용하면 원하는 멤버변수의 값으로 세팅해줄 수 있습니다.

 

1) getter 선언

아래와 같은 방식으로 getter 메소드를 선언할 수 있다.

public String getColor() {
	return color;
}

public 리턴타입 get필드이름() {

         return 필드값;

}

 

2) setter 선언

아래와 같은 방식으로 setter 메소드를 선언할 수 있다.

public void setColor(String color) {
	this.color = color;
}

public void set필드이름() {

         필드값;

}

'Java Study' 카테고리의 다른 글

Java Study(캡슐화)  (0) 2023.04.19
Java Study(배열/키 값)  (0) 2023.04.04
Java Study(상속/오버라이딩)  (0) 2023.03.31
Java(class/object)  (0) 2023.03.29
Java (method/메소드)  (0) 2023.03.28

1. Class?

  • 자바에서 클래스(class)란 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용됩니다.
  • 자바에서는 이러한 설계도인 클래스를 가지고, 여러 객체를 생성하여 사용하게 됩니다.
  • 클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성됩니다.
  • 즉, 필드(field)란 클래스에 포함된 변수(variable)를 의미합니다.

1) 클래스 구현

public class Cat {

    String name;
    String breeds;
    double weight;

}
  • 먼저 Cat 클래스를 만듭니다.
  • Cat  클래스안의 변수를 선언합니다.
public class Cat {

    String name;
    String breeds;
    double weight;
    
    void claw() {
    	System.out.println("할퀴기!!");
   }
   
   void meow() {
   		System.out.println("야옹~"); 
   }

}
  • 각 메소드(claw, meow)를 정의하여 클래스를 구현합니다.

 

2. Object(객체)?

  • 객체란 속성과 기능이 묶인 프로그램 단위를 말한다.
  • 객체는 각각 독립적으로 존재하며 다른 객체와 서로 상호작용을 할 수 있다.
  • 자바에서는 클래스에서 생성된 데이터를 객체로 정의한다. 

1) 객체 생성

Cat c = new Cat();
  • Cat 클래스를 이용해 객체를 생성하는 과정입니다.
  • Cat 이라는 클래스 뒤에 c라는 래퍼런스 변수명을 생성합니다.
  • 그 다음 new Cat()이라는 객체를 생성해 c변수에 대입합니다.

 

 

3. Instance(인스턴스)?

  • 인스턴스는 객체에 포함된 것이다.
  • 객체를 소프트웨어에 실체화 하면 인스턴스라고 부른다.
c.name = "네로";
c.bredds = "페르시안";
c.weight = "4.37";
  • 래퍼런스 변수 c에 연결된 객체로 접근합니다.
  • 해당객체에서 name, breeds, weight을 가져옵니다.
  • 가져온 인스턴스 변수들을 위 값으로 변경해줍니다.

 

4. 실습예제

exercise) 아래 뼈대 코드를 이용해 정사각형 클래스를 구현하여 정사각형의 넓이를 구하는 프로그램을 작성하세요

public class Square {







public static void main(String[] args) {


	
    
    
    }

}

 

Solution)

public class Square {

    int length;

    public int area() {
        int area = length * length;
        return area;
    }

    public static void main(String[] args) {
        Square s = new Square();
        s.length = 4;
        System.out.println("Square area is " + s.area());

    }

}

'Java Study' 카테고리의 다른 글

Java Study(캡슐화)  (0) 2023.04.19
Java Study(배열/키 값)  (0) 2023.04.04
Java Study(상속/오버라이딩)  (0) 2023.03.31
Java Study(생성자/접근제한자)  (0) 2023.03.30
Java (method/메소드)  (0) 2023.03.28

1. method?

어떠한 문제를 처리하기 위한 방법을 소스 코드로 묶어놓고 필요(호출)에 따라 동작하는 기능 정도로 생각할 수 있습니다.(다른 언어에서는 함수(function)으로 불립니다.)

 

1) method 선언

public static 리턴타입(자료형, void) 메서드명() {
	메서드 작성
    return 리턴 데이터;
}
  • main 메소드는 프로그램의 시작점 역할을 하는 JAVA의 약속된 내용이다. 즉, main 메소드가 없는 프로그램은 별도로 동작할 수가 없다. 컴퓨터가 소스 코드를 읽을 때 main 메소드를 실행하고 거기에 정의된 로직에 따라 프로그램이 동작하게 된다.

     

  •  위에서 설명하였듯이 메소드의 리턴 타입은 자료형 또는 void가 올 수 있다. 자료형이 리턴 타입으로 오면 반환(return)해 주는 값(메소드 자료형과 동일한 값)이 반드시 있어야 하고 void는 반환 값이 없다. 다르게 말하면 반환하고자 하는 데이터가 있다면 그 데이터의 자료형을 메소드의 자료형으로 적어줘야 한다.

     

  • 메소드 내에서 동작하고 얻은 결과(필요한 데이터)를 반환해주는 역할을 한다. return문 뒤에는 어떠한 구문도 올 수 없다.(컴파일 에러 발생) 다르게 말하면 return문을 사용하면 값을 반환해 주고 해당 메소드는 실행이 종료된다.

     

2) method 호출

public static void 메서드명();
  • 기본적으로 메서드를 호출하는 방식은 위와같이 매우 간단합니다.
  • 메인 메소드 안에서 필요한 메소드를 호출하면 됩니다.

 

3) method 호출 매개변수

public static 리턴타입(자료형 또는 void) 메소드명(자료형 변수명) {

}

public static void main (String[] args) {
	메소드명(값);
}
  •  메소드의 매개변수(parameter)란 외부로부터 입력 값을 받기 위해 메소드의 괄호 안에 선언하는 변수라고 생각하면 된다.
  • main메소드에서 다른 메소드를 호출할 때 값을 전달하여 전달된 값에 따라 처리될 수 있도록 하는 기능이다.

 

3-1 실습예제

Exercise) 두 수를 나눈 몫을 출력하는 메소드와 두 수를 곱한 값을 출력하는 메소드를 각각 작성하세요

 

Solution)

package com.example.atmexercise;

public class AtmExercise {
    public static void main(String[] args) {
        System.out.println(divideNumbers(6, 3));
        System.out.println(multiplyNumbers(6, 3));


    }

    public static int divideNumbers(int firstNumber, int secondNumber) {
        return (firstNumber/secondNumber);


    }

    public static int multiplyNumbers(int firstNumber, int secondNumber) {
        return (firstNumber * secondNumber);

    }
}

 

 

'Java Study' 카테고리의 다른 글

Java Study(캡슐화)  (0) 2023.04.19
Java Study(배열/키 값)  (0) 2023.04.04
Java Study(상속/오버라이딩)  (0) 2023.03.31
Java Study(생성자/접근제한자)  (0) 2023.03.30
Java(class/object)  (0) 2023.03.29

+ Recent posts