সহজ জাভা: লুপ, অ্য াের ও অবেজক্ট — হােত-কলেম গাইড উপিশেরানাম: একদম সহজ ভাষায় লুপ, অ্য াের, িডবািগং, this ও কনস্ট্র াক্ট র শখা সূিচপত্র 1. ভূিমকা ও কীভােব পড়েবন 2. লুেপর ব সক: for, while ও সং 3. এক-মাি ক অ্য াের (1D Array) 4. দুই/িতন-মাি ক অ্য াের (2D/3D Array) 5. িডবািগং: Breakpoint, Step Into/Over 6. অবেজক্ট -ওিরেয়েন্ট ড ভাবনা: ৪টি িপলার 7. this কীওয়াড — কখন ও কন 8. কনস্ট্র াক্ট র: িডফল্ট , প্য ারািমটারাইজড, ওভারেলািডং 9. কনস্ট্র াক্ট র চইিনং (this(...)) 10. toString() ও অবেজক্ট সুন্দ রভােব প্র ন্ট করা 11. কমন ভুল, সতক তা ও টিপস 12. অনুশীলনী (Exercises) 13. ক্ষ ু দ্র শব্দ েকাষ (Glossary) 1) ভূিমকা ও কীভােব পড়েবন এই বইটি এমনভােব সাজােনা য আপিন জাভার ব সক থেক অবেজক্ট -ওিরেয়েন্ট ড ধারণা পয ন্ত ধােপ ধােপ এেগােত পারেবন। কেথাপকথেনর ভি বাদ িদেয় সহজ বাংলা , ছাট ছাট কাড-উদাহরণ এবং ধােপ ধােপ ব্য াখ্য া —এ িতনটি িজিনেস জার দওয়া হেয়েছ। শখার লক্ষ ্য ● for/while লুপ কীভােব কাজ কের, সং কের বাঝা ● 1D/2D/3D অ্য াের তির, পড়া/ লখা, লুপ িদেয় প্র ন্ট ● িডবািগং কের ধােপ ধােপ এ ক্স িকউশন দখা ● this কীওয়াড , কনস্ট্র াক্ট র, ওভারেলািডং ও চইিনং ● toString() ও অবেজক্ট সুন্দ রভােব দখােনা ● কমন ভুল এিড়েয় িনরাপদ ও পিরষ্ক ার কাড লখা 2) লুেপর ব সক: for, while ও সং লুপ িতন ভােগ ভাবুন— শু রু (initialization) , শত (condition) , বৃি /হ্র াস (update) । for (int i = 1; i <= 5; i++) { System.out.println(i); } উপেরর কােড: ● শু রু : int i = 1 ● শত : i <= 5 ● আপেডট: i++ একই িজিনস while িদেয়: int i = 1; // initialization while (i <= 5) { // condition System.out.println(i); i++; // update } সং টিপস (ম ে ধােপ ধােপ চালান): ● প্র থেম i = 1 → শত সত্য → প্র ন্ট 1 → i = 2 ● ... এভােব i = 5 পয ন্ত ● i = 6 হেল শত িমথ্য া → লুপ শষ মূল কথা (Key Takeaways) ● for ও while আসেল একই কাঠােমা; শু ধু লখার ধরন আলাদা ● ভুল শত িদেল ( যমন i <= 5 এর বদেল i < 5) আউটপুট বদেল যােব ● সং করেল লিজক্য াল ভুল সহেজ ধরা পেড় 3) এক-মািত্র ক অ্য াের (1D Array) অ্য াের কী? একই ডটা টাইেপর একািধক ভ্য ালু একসােথ ধারন কের এমন স্ট্র াকচার। জাভায় int হেলা ৪ বাইট (32-bit)। প্র িমটিভ টাইেপর 1D অ্য াের মমিরেত ধারাবািহকভােব রাখা হয় (JVM ম্য ােনজ কের)। int[] students = new int[3]; // সাইজ 3 students[0] = 10; students[1] = 20; students[2] = 30; for (int i = 0; i < students.length; i++) { System.out.println(students[i]); } শট কাট ইিনিশয়ালাইেজশন: int[] marks = {70, 80, 90, 100}; System.out.println(marks.length); // 4 কমন ভুল: int[] a = new int[3]; // index 0..2 System.out.println(a[3]); // ❌ ArrayIndexOutOfBoundsException মূল কথা ● ইনেডক্স সবসময় 0 থেক শু রু ● লুেপ i < array.length ব্য বহার করু ন ● সাইজ িফক্স ড; সাইজ বাড়ােত চাইেল নতুন অ্য াের লাগেব (বা ArrayList িশখুন) 4) দুই/িতন-মািত্র ক অ্য াের (2D/3D Array) জাভায় 2D/3D অ্য াের আসেল অ্য ােরর অ্য াের । অথ াৎ প্র িতটি রা িনেজও একটি অ্য াের। তাই প্র িতটি রােয়র দঘ ্য সমান/অসমান—দুইই হেত পাের। 2D উদাহরণ: int[][] grid = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; for (int r = 0; r < grid.length; r++) { for (int c = 0; c < grid[r].length; c++) { System.out.print(grid[r][c] + (c + 1 < grid[r].length ? ", " : "")); } System.out.println(); } 3D ধারণা (একটা ঘনক/ লয়ার): int[][][] cube = new int[2][2][2]; cube[0][0][0] = 1; // ... বািক ভরু ন বা লুেপ সট করু ন for (int x = 0; x < cube.length; x++) { for (int y = 0; y < cube[x].length; y++) { for (int z = 0; z < cube[x][y].length; z++) { System.out.println("cube[" + x + "][" + y + "][" + z + "] = " + cube[x][y][z]); } } } মূল কথা ● 2D/3D মােন nested লুপ ● grid.length → রা সংখ্য া, grid[r].length → ওই রার কলাম সংখ্য া ● জাভায় 2D/3D অ্য াের জ্য াগড হেত পাের (সব রার কলাম সমান নাও হেত পাের) 5) িডবািগং: Breakpoint, Step Into/Over কােড ভুল ধরা ও লুপ/অ্য াের স করেত িডবািগং সবেচেয় কায কর। ধাপগু েলা (IntelliJ/Eclipse—দুইেতই িমল): 1. প্র েন্ট র বদেল লাইেন Breakpoint িদন (লাইন নম্ব েরর পােশ িক্ল ক) 2. Debug মােড রান করু ন 3. Variables প্য ােনেল ভিরেয়বলগু েলার ভ্য ালু লাইভ দখুন 4. Step Over (F8/Eclipse-এ F6) : লাইেনর ভতেরর ফাংশেন না ঢুেক সামেন যান 5. Step Into (F7/Eclipse-এ F5) : কল হওয়া মথেডর ভতের ঢােকন 6. Step Out : বত মান মথড থেক বর হন মূল কথা ● িডবািগং আপনােক “ কাড কীভােব চলেছ” সটা চােখ দখায় ● লুপ/শত /ইনেডক্স জিনত বাগ ধের ফলেত দারু ণ কােজ লােগ 6) অবেজক্ট -ওিরেয়েন্ট ড ভাবনা: ৪টি িপলার 1. Encapsulation — ডটা + মথড একসােথ রাখা, বাইের থেক সরাসির অ্য ােক্স স না িদেয় getter/setter িদেয় িনয়ন্ত্র ণ 2. Abstraction — জটিল বাস্ত বায়ন লুিকেয় সহজ ইন্ট ারেফস দওয়া 3. Inheritance — প্য ােরন্ট থেক চাইেল্ড বিশষ্ট ্য /িবেহিভয়ার পাওয়া 4. Polymorphism — “এক নাম, অেনক রূ প”: ওভারেলািডং/ওভাররাইিডং 7) this কীওয়াড — কখন ও কন this মােন বত মান অবেজক্ট । মূল ব্য বহার: ● িফল্ড - শিডং দূর করা: লাকাল প্য ারািমটার আর ইনস্ট ্য ান্স ভিরেয়বল একই নােম হেল ● চইিনং কনস্ট্র াক্ট র কল: this(...) ● বত মান অবেজক্ট পাস করা/িরটান করা class Student { private int id; private String name; public void setId(int id) { this.id = id; // বামটা িফল্ড , ডানটা প্য ারািমটার } public Student setName(String name) { this.name = name; return this; // chaining-friendly } } 8) কনস্ট্র াক্ট র: িডফল্ট , প্য ারািমটারাইজড, ওভারেলািডং class Student { private int id; private String name; // 1) িডফল্ট কনস্ট্র াক্ট র public Student() { this.id = 0; this.name = "Student"; System.out.println("Student object created"); } // 2) শু ধু id public Student(int id) { this.id = id; } // 3) শু ধু name public Student(String name) { this.name = name; } // 4) id + name (ওভারেলািডং) public Student(int id, String name) { this.id = id; this.name = name; } } মূল কথা ● একটি ক্ল ােস কনস্ট্র াক্ট র একািধক হেত পাের (ওভারেলািডং) ● পাথ ক্য হয় প্য ারািমটােরর সংখ্য া/টাইপ/অড ার িদেয় ● িডফল্ট কনস্ট্র াক্ট র না লখেল কম্প াইলার অেটােমটিক দয়— শু ধু তখনই , যখন আপিন িনেজ কােনা কনস্ট্র াক্ট র লেখনিন 9) কনস্ট্র াক্ট র চইিনং (this(...)) এক কনস্ট্র াক্ট র থেক আেরকটি একই ক্ল ােসর কনস্ট্র াক্ট র কল: class Student { private int id; private String name; public Student() { this(0, "Student"); // চইন: ২-প্য ারািমটার কনস্ট্র াক্ট রেক কল System.out.println("Default constructor ran"); } public Student(int id) { this(id, "Student"); // চইন } public Student(String name) { this(0, name); // চইন } public Student(int id, String name) { this.id = id; this.name = name; System.out.println("Main constructor ran"); } } রুলস ● this(...) সব দা প্র থম টেমন্ট হেত হেব ● চইিনং কাড-ডুি েকশন কমায়, ইিনিশয়ালাইেজশন এক জায়গায় রােখ 10) toString() ও অবেজক্ট সুন্দ রভােব প্র ন্ট করা class Student { private int id; private String name; // ... constructors @Override public String toString() { return "Student{id=" + id + ", name='" + name + "'}"; } } public class Demo { public static void main(String[] args) { Student s = new Student(1, "Nadim"); System.out.println(s); // toString() অেটা কল হয় } } অ্য াের অফ অবেজক্ট স: Student[] group = { new Student(1, "Nadim"), new Student(2, "Imran"), new Student(3, "Ifat") }; for (Student st : group) { System.out.println(st); // সুন্দ র প্র ন্ট (toString) } 11) কমন ভুল, সতক তা ও টিপস ● Out-of-Bounds: অ্য ােরেত length ভুল ব্য বহার করেল এেক্স পশন ● Null: অবেজক্ট অ্য ােরেত ( যমন Student[]) নতুন ইনেডেক্স অবেজক্ট েয়ট করেত ভুলেবন না ● 2D অ্য াের: জাভায় 2D হেলা “অ্য ােরর অ্য াের”; সব রার দঘ ্য এক হেত বাধ্য নয় ● িডবািগং না করা: কনেসাল প্র েন্ট র পাশাপািশ িডবাগার চা লেয় ভিরেয়বল দখুন ● ডুি েকট কাড: কনস্ট্র াক্ট র চইিনং ব্য বহার কের ইিনিশয়ালাইেজশন এক জায়গায় রাখুন 12) অনুশীলনী (Exercises) 1. লুপ সং: 1-10 পয ন্ত সংখ্য ার মেধ্য শু ধু জাড় সংখ্য া প্র ন্ট করু ন—for ও while দুইভােব। 2. 1D অ্য াের: ইউজােরর দয়া ৫টি সংখ্য া ইনপুট িনন, মাট (sum), গড় (avg) ও সেব াচ্চ (max) বর করু ন। 3. 2D অ্য াের: 3×3 ম্য াট্রি ক্স ইনপুট িনেয় প্র িতটি রার যাগফল প্র ন্ট করু ন। 4. অবেজক্ট অ্য াের: Student(id, name) ক্ল াস বািনেয় ৩ জন ছাে র অ্য াের করু ন; লুেপ সব প্র ন্ট । 5. কনস্ট্র াক্ট র চইিনং: Book ক্ল ােস চারটি কনস্ট্র াক্ট র (িডফল্ট , শু ধু title, শু ধু price, title+price) লেখ this(...) িদেয় চইন করু ন। 6. িডবািগং: একটি লুেপ কপেয়ন্ট িদেয় Step Over/Into ব্য বহার কের স করু ন; ভিরেয়বল কীভােব বদলায় নাট করু ন। 13) ক্ষ ু দ্র শব্দ েকাষ (Glossary) ● Initialization (শু রু ): ভিরেয়বেল প্র থম মান বসােনা ● Condition (শত ): চালু/বন্ধ করার পরীক্ষ ার ধাপ (i < n) ● Update (আপেডট): মান বাড়ােনা/কমােনা (i++) ● Array (অ্য াের): একই টাইেপর ডটার ধারাবািহক তা লকা ● Constructor (কনস্ট্র াক্ট র): অবেজক্ট তিরর িবেশষ মথড ● Overloading (ওভারেলািডং): একই নােমর একািধক মথড/কনস্ট্র াক্ট র, প্য ারািমটাের পাথ ক্য ● Chaining ( চইিনং): এক কনস্ট্র াক্ট র থেক আেরকটা কনস্ট্র াক্ট র কল ● this: বত মান অবেজেক্ট র রফােরন্স ● Debugging: ধােপ ধােপ কাড চা লেয় ভ্য ালু/ া দখা দ্রু ত িচট-িশট ● for টমে ট: for (init; condition; update) { ... } ● 1D অ্য াের: int[] a = new int[3]; a[0] = 10; ● 2D অ্য াের: int[][] m = new int[3][3]; ● লুেপ অ্য াের: for (int i = 0; i < a.length; i++) ● অবেজক্ট : Class c = new Class(...); ● কনস্ট্র াক্ট র চইিনং: this(...); (প্র থম লাইেন) ● সুন্দ র প্র ন্ট : @Override public String toString() { ... } ● িডবািগং িকজ: Breakpoint → Step Over/Into/Out সমাপনী কথা লুপ, অ্য াের, this, কনস্ট্র াক্ট র ও িডবািগং—এই পঁাচটি িবষয় হােতর মুেঠায় আনেত পারেল জাভার বািক টিপকগু েলা শখা অেনক সহজ হেয় যায়। প্র িতটা অধ্য ােয়র শেষ দওয়া অনুশীলনী করেল ধারণা দৃঢ় হেব, আর িডবািগং অভ্য াস করেল ভুল ধরেত ইিজ হেব। শু ভকামনা! বানাস: সম্প ূ ণ উদাহরণ (সব একসােথ) class Student { private int id; private String name; // Constructor chaining public Student() { this(0, "Student"); System.out.println("Default constructor ran"); } public Student(int id) { this(id, "Student"); } public Student(String name) { this(0, name); } public Student(int id, String name) { this.id = id; this.name = name; System.out.println("Main constructor ran"); } public int getId() { return id; } public Student setId(int id) { this.id = id; return this; } public String getName() { return name; } public Student setName(String name) { this.name = name; return this; } @Override public String toString() { return "Student{id=" + id + ", name='" + name + "'}"; } } public class Main { public static void main(String[] args) { // Loop for (int i = 1; i <= 5; i++) { System.out.print(i + (i < 5 ? ", " : "\n")); } // 1D array int[] nums = {10, 20, 30, 40}; for (int i = 0; i < nums.length; i++) { System.out.println("nums[" + i + "] = " + nums[i]); } // 2D array int[][] grid = { {1,2,3}, {4,5,6}, {7,8,9} }; for (int r = 0; r < grid.length; r++) { for (int c = 0; c < grid[r].length; c++) { System.out.print(grid[r][c] + (c + 1 < grid[r].length ? ", " : "")); } System.out.println(); } // Objects + array of objects Student[] group = { new Student(), // default -> chains to main new Student(2), // id only new Student("Imran"), // name only new Student(4, "Nadim") // id + name }; for (Student s : group) { System.out.println(s); } } }